Условие_ переменная должно использоваться вместе с флагом, чтобы помочь предотвратить ложные пробуждения. Этот же флаг можно также использовать для проверки того, должен ли поток вообще ждать или просто приступить к работе.
Добавьте bool go_to_work=false;
, затем мы просто добавим его в качестве предиката при вызове к wait
и убедимся, что мы установили / удалили его из основного потока.
В главном потоке перед вызовом notify_all мы устанавливаем наш bool
go_to_work=true;
cond.notify_all();
В нашем рабочем потоке мы добавляем предикат к нашему wait
вызову
cond.wait(lock, [](){ return go_to_work; });
Наконец, в нашем основном потоке мы хотим установить флаг обратно в false после того, как вся работа была выполнена.
barrier.wait();
lock.lock(); // We need to lock the mutex before modifying the bool
go_to_work=false;
lock.unlock();
//Handle result...
Теперь, если поток достигает вызова wait
после того, как основной поток установил go_to_work=true
, он вообще не будет ждать и просто продолжит работу. В качестве бонуса это также защищает от ложных пробуждений.