当我有多个线程等待执行时,我试图了解 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++ 库到操作系统内核,甚至可能是硬件)可能以某种方式实现,从而可以推断出哪个线程将被唤醒并获得锁,但从我们使用条件变量的应用程序编写者的角度来看,没有预先确定的顺序,它是随机的。
关于c++ - 了解 std::condition_variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776786/