concurrency - 为什么条件变量有时会错误唤醒?

标签 concurrency condition-variable

我早就知道你使用条件变量的方式是

lock
while not task_done
  wait on condition variable
unlock

因为有时条件变量会自发唤醒。但我一直不明白为什么会这样。在过去,我读过创建一个没有这种行为的条件变量是很昂贵的,但仅此而已。

那么......为什么你需要担心在等待条件变量时被错误唤醒?

最佳答案

并不是条件变量会错误地唤醒;条件变量只有在从另一个线程发出信号时才会唤醒。但是,当线程被重新调度执行时,其他线程可能已经设法获取了您正在等待的资源,因此有必要进行仔细检查。例如,如果一组线程 x,y,z 正在等待 w 之前持有的某个资源 R,并且 x,y,z,w 通过条件变量进行通信……假设 w 已完成 R 并发出信号 x ,y,z。因此,x、y 和 z 都将从等待队列中取出并放入运行队列中以安排执行。假设 x 首先被调度……所以它获取 R,然后它可能会被置于 sleep 状态,然后 y 可能被调度,因此当 y 正在运行时,y 之前等待的资源 R 仍然不可用,所以有必要让 y 再次休眠。然后z醒了,z也发现R还在用,所以z需要再回去 sleep ,等等。

如果您正好有两个线程,并且条件变量仅在其中两个线程之间共享,则有时可以不执行该检查。然而,如果你想让你的应用程序动态化并且能够扩展到任意数量的线程,那么最好养成习惯(更不用说更简单和更不担心)来做额外的检查,因为它是必需的大多数情况。

关于concurrency - 为什么条件变量有时会错误唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2727238/

相关文章:

c - 信号量术语

java - 创建和加入线程时副作用的可见性

c++ - 我是否需要在多线程环境中保护对 STL 容器的读取访问?

java - 以线程安全的方式并行执行多台机器

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

C++ 条件等待竞争条件

c++ - condition_variable,引用和线程:谁拥有锁?

go - 如何进行可重新启动的线程安全AfterFunc()调用

c# - 信号量 - 初始计数有什么用?

c - 虚假唤醒后的互斥锁状态