了解 std::condition_variables

Understanding std::condition_variables

当我有多个线程等待执行时,我试图了解 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,但在它们等待时,它们并不持有锁。因此,其他线程可以通过 wait 函数。

当您调用 wait(单参数版本)时,锁被解锁并且线程进入等待状态,直到 CV 为 "notified"。当线程唤醒时,锁再次被锁定。

当您调用 notify_one, basically a random thread waiting on the CV will be notified. When you call notify_all 时,所有等待 CV 的线程将从等待状态中唤醒,第一个锁定锁的将是继续的线程。 哪个也是随机的。

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