了解std :: condition_variables

时间:2015-09-25 07:17:11

标签: c++ c++11 condition-variable

当我有多个线程等待执行时,我试图理解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

2 个答案:

答案 0 :(得分:3)

当您调用wait(单参数版本)时,锁定被解锁并且线程进入等待状态,直到CV被通知&#34;。当一个线程被唤醒时,锁再次被锁定。

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

请注意,当我说&#34; random&#34;时,系统上的线程(从C ++库到操作系统内核甚至硬件)的实际实现可能会以某种方式实现可以推断出哪个线程会被唤醒并获得锁定,但从我们使用条件变量的应用程序编写者的角度来看,没有预定的顺序,它是随机的。 / p>

答案 1 :(得分:2)

虽然线程必须一次调用一个wait,但在等待时,它们不会保持锁定。因此,额外的线程可以通过wait函数。