gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:26:39 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com