有关先前“条件变量”帖子的内容

时间:2012-10-10 09:14:24

标签: linux operating-system linux-kernel

问题是有关条件变量的帖子,我瞥了一眼。 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中调用?我的理解是否正确?

1 个答案:

答案 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由于某种原因再次运行)。