C ++ 11: все потоки должны ждать, пока каждый поток завершит sh шаг 1, прежде чем они все начнут шаг 2 - PullRequest
1 голос
/ 06 мая 2020

Я запускаю много дочерних потоков, и все они выполняют свою первую задачу. Я хочу, чтобы они все подождали, прежде чем продолжить свою вторую задачу.

Моя идея заключалась в каком-то коде вроде:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...