问题是有关条件变量的帖子,我瞥了一眼。 condition variable
作者首先给出一个错误的例子:
/* in thread 1 */
pthread_mutex_lock(mx);
if (state == GOOD) {
pthread_mutex_unlock(mx); // Here !
wait_for_event();
pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx);
state = GOOD;
pthread_mutex_unlock(mx);
signal_event(); /* expecting to wake thread 1 up */
并解释如下:
'这个伪代码样本带有一个bug。如果调度程序决定在pthread_mutex_unlock(mx)之后但在wait_for_event()之前将上下文从线程1切换到线程2,会发生什么。在这种情况下,线程2不会唤醒线程1,线程1将继续睡眠,可能是永远。“
我知道应该如何使用条件变量,正如作者后来在同一篇文章中所展示的那样。
我可以看到,在这个错误的示例中,'state == GOOD'判断和'wait_for_event()'不会被互斥锁整体锁定。如果线程1在第一个' pthread_mutex_unlock(mx); '之后立即切换上下文,则线程2可以将'state'更改为其他内容(BAD?),并发出信号以唤醒线程1继续在'state == GOOD'逻辑中,我认为这是错误的。
但为什么作者说“在这种情况下,线程2不会唤醒线程1,线程1将继续睡眠,可能永远。”?
不是'signal_event();'仍在线程2中调用?我的理解是否正确?
答案 0 :(得分:0)
该错误是由signal_event()
和wait_for_event()
的语义引起的。如果在signal_event()
中没有人被卡住时调用wait_for_event()
,则信号将丢失。
除了上下文切换之外,如果线程2快速运行且线程1很慢,则会出现同样的问题。在这种情况下,线程1之间的时间
pthread_mutex_unlock(mx);
和
wait_for_event();
可能是当thread2完成所有操作时,发送信号被遗忘(因为没有人在等待它)。然后线程1等待,它将永远不会得到信号(除非线程2由于某种原因再次运行)。