当我有多个等待执行的线程时,我试图了解condition_variable的流程。据我了解,所有线程都将尝试获取唯一的锁,将其获取,然后进行到wait(),如果调用notify_all,则最多不会有一个线程可以等待通过。直到释放它的锁,并允许其他线程通过。

cv是否与唯一锁通信,并一次让所有线程通过?如果是这样,那么这真的是一次全部完成,还是线程又一次又一次地通过。

std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
                 // 1) to synchronize accesses to i
                 // 2) to synchronize accesses to std::cerr
                 // 3) for the condition variable cv
int i = 0;

void waits()
{
    std::unique_lock<std::mutex> lk(cv_m);
    std::cerr << "Waiting... \n";
    cv.wait(lk, []{return i == 1;});
    std::cerr << "...finished waiting. i == 1\n";
}

http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all

最佳答案

当您调用 wait (单参数版本)时,锁被解锁,线程进入等待状态,直到CV被“通知”。当线程唤醒时,锁再次被锁定。

当您调用 notify_one 时,基本上会通知等待CV的随机线程。当您调用 notify_all 时,所有等待CV的线程都将从等待状态中唤醒,第一个锁定该锁的线程将继续。那将是随机的。

请注意,当我说“随机”时,系统上线程的实际实现(从C++库到操作系统内核乃至硬件)可能以某种方式实现,从而可以推断出哪个线程将被一个唤醒并获得锁的程序,但是从我们使用条件变量的应用程序编写者的 Angular 来看,没有预定的顺序,它是随机的。

10-04 16:22
查看更多