asp*_*spo 6 concurrency condition-variable
我已经知道你使用条件变量的方式是
lock
while not task_done
wait on condition variable
unlock
Run Code Online (Sandbox Code Playgroud)
因为有时条件变量会自发唤醒.但我永远不明白为什么会这样.在过去,我已经读过制作一个没有这种行为的条件变量的代价很高,但仅此而已.
那么......为什么你需要担心在等待条件变量时错误地被唤醒?
并不是条件变量会被错误唤醒;而是条件变量会被错误唤醒。仅当条件变量收到另一个线程的信号时才会被唤醒。然而,当线程被重新安排执行时,其他一些线程可能已经成功地获取了您正在等待的资源,因此有必要进行仔细检查。例如,如果一组线程 x,y,z 正在等待 w 先前持有的某个资源 R,并且 x,y,z,w 通过条件变量进行通信...假设 w 已完成 R 并向 x 发送信号,y,z。因此,x、y 和 z 都将从等待队列中取出并放入运行队列中以安排执行。假设x先被调度...然后它获取R,然后它可能会进入睡眠状态,然后y可能会被调度,所以当y运行时,y之前等待的资源R仍然不可用,所以 y 有必要再次进入睡眠状态。然后z醒来,z也发现R还在使用,所以z需要再次回去休眠,等等。
如果您恰好有两个线程,并且条件变量仅在其中两个线程之间共享,则有时可以不执行该检查。但是,如果您想让您的应用程序动态化并且能够扩展到任意数量的线程,那么最好养成习惯(更不用说更简单且更不用担心)进行额外的检查,因为它是大多数情况。