c++ - 了解 std::condition_variables

标签 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

最佳答案

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

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

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

关于c++ - 了解 std::condition_variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776786/

相关文章:

c++ - 可以 std::vector 使用小缓冲区优化吗?

c++ - 默认情况下是否应该有任何功能能够就地工作

c++ - 线程等待如何影响程序的执行时间?

c++ - 数组在通过引用传递给函数之前和之后显示不同的地址

c# - 用于多平台大型软件开发的编程语言?

c++ - 在同一行中声明对象和调用函数时发生意外优化

c++ - 将类的成员函数传递给类外的参数

c++ - 为什么这个使用统一初始化的代码片段使用 g++4.6 而不是 g++4.7 编译?

c++ - notify_all 崩溃后直接删除 std::condition_variable_any

c++ - 等待条件变量后线程未并行运行