انتظار جهت اتمام عملیات thread_pool - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

انتظار جهت اتمام عملیات thread_pool

+1 امتیاز

سلام. من thread_pool ی را استفاده می کنم که متدی از کلاس توسط این thread_pool فراخوانی میشه از آنجایی که اجرای thread_pool به صورت detach صورت می گیره قبل از اینکه خروجی متدها فراخوانی شده توسط thread_pool فراخوانی بشه از تابع خارج میشم چطور می تونم منتظر پایان خروجی باشم البته این نکته را هم ذکر کنم که نمی خواهم یه thread مجزا بسارم و join ش کنم دنبال یه مکانیزم انتظار تا پایان thread_pool هستم.

class A {

			int method1() {
                              //myhuge  process here
			}

			void run() {
				std::vector<int> res(8);

				ThreadPool thread_pool(8);
				for (int i = 0; i < 8; i++) {

					thread_pool.enqueue([this]() {
						method1();

					});
				}

			}
		};

 

سوال شده خرداد 30, 1398  بوسیله ی Mad (امتیاز 245)   10 35 47

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

روش صحیح استفاده از std::condition_variable هستش برای اینکار در انتهای تابع فوق از متد wait این کلاس استفاده کنید تا زمانی شرط خاتمه برقرار باشه مثلا بعدی از فراخوانی method1 یه شمارنده را افزایش بدید که در مثال بالا از شمارنه به 8 رسید یعنی همان شرط خاتمه .

 

class A {

			int method1() {
				//myhuge  process here
			}

			void run() {
				std::mutex mtx;
				std::condition_variable cv;
				std::atomic<int> counter = 0;

				std::vector<int> res(8);

				ThreadPool thread_pool(8);
				for (int i = 0; i < 8; i++) {

					thread_pool.enqueue([this,&counter,&cv]() {
						method1();
						counter++;
						cv.notify_one();

					});
				}

				{
					std::unique_lock<std::mutex> lck;
					cv.wait(lck, [&counter] {return counter >= 8; });
				}

			}
		};
		

 

پاسخ داده شده خرداد 30, 1398 بوسیله ی عباس همت خواه (امتیاز 436)   2 8 13
انتخاب شد اردیبهشت 1, 1399 بوسیله ی Mad
...