首页 > 解决方案 > C++11:所有线程必须等待每个线程完成第 1 步,然后才能开始第 2 步

问题描述

我启动了许多子线程,它们都完成了他们的第一个任务。我希望他们都等待,然后再继续他们的第二项任务。

我的想法是一些代码,例如:

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.
         :
         :
}

当然,事实证明条件变量不是那样工作的。我试图弄清楚它们是否对这个问题有用,或者我是否需要期货,或者什么。

我最好的主意是使用 C++17 shared_mutex。主线程将获得排他锁lock()notify_all()在上面的示例中实际上是unlock()whilewait()将是lock_shared()。一旦独占锁被释放,所有非独占锁寻求者都会成功并继续。然而,它似乎与锁类的精神完全不同,我不想超过 C++11。

标签: multithreadingc++11locking

解决方案


推荐阅读