Я запускаю много дочерних потоков, и все они выполняют свою первую задачу. Я хочу, чтобы они все подождали, прежде чем продолжить свою вторую задачу.
Моя идея заключалась в каком-то коде вроде:
some_lock_type lock;
atomic<int> iThreadsDoneStep1;
void Thread() {
// Step 1.
:
:
// Now wait for the rest to finish step 1, or if I am the last to finish, wake up the others.
if ( ++iThreadsDoneStep1 == iThreadCount )
lock.notify_all();
else
lock.wait();
// Step 2.
:
:
}
Конечно, оказалось, что переменные условия так не работают. Я пытаюсь понять, полезны ли они вообще для этой проблемы, нужны ли мне фьючерсы или что-то в этом роде.
Лучшая идея, которая у меня есть, - это использовать shared_mutex C ++ 17. Основной поток получит эксклюзивную блокировку с помощью lock()
, а notify_all()
в приведенном выше примере будет фактически unlock()
, а wait()
будет lock_shared()
. Как только исключительная блокировка будет освобождена, все неисключительные искатели блокировки будут успешны и продолжат работу. Однако он, похоже, полностью отличается от духа класса блокировки, и я бы предпочел go не выходить за пределы C ++ 11.