0
我正在設計一個系統,其中一個工作者池將任務從隊列中彈出,並且我希望主線程等待所有要完成的任務。這是我想出迄今(僞):一個線程在幾個等待的信號機制
// Main
launch_signal();
for (auto &worker : pool) {
// create unique_lock
if (!worker.done)
worker.condition_variable.wait(lock, worker.done);
}
// Worker
if (queue.empty()) {
mutex.lock();
this->done = true;
mutex.unlock();
this->condition_variable.notify_one();
// wait for launch signal from Main
} else {
mutex.lock();
auto job = queue.pop();
mutex.unlock();
job.execute();
}
所以Main
信號的作業都可用,然後等待每一位勞動者的信號了。同時保持彈出作業不在隊列中直到空,然後完成信號並進入等待發射信號。
我的問題:什麼是更有效的算法呢?
[OT]您應該使用['std :: lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard),而不是手動鎖定和解鎖互斥鎖。 – NathanOliver
絕對如此(重要)細節被省略。 –