【发布时间】:2012-10-10 09:14:24
【问题描述】:
问题是关于我浏览的关于条件变量的帖子。 condition variable
作者先举个bug的例子:
/* 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 */
并解释如下:
'这个伪代码示例带有一个错误。如果调度程序决定在 pthread_mutex_unlock(mx) 之后但在 wait_for_event() 之前将上下文从线程 1 切换到线程 2,会发生什么情况。在这种情况下,线程 2 不会唤醒线程 1,线程 1 将继续休眠,可能会永远休眠。'
我知道应该如何使用条件变量,正如作者稍后在同一篇文章中所展示的那样。
我可以看到,在这个错误的示例中,'state == GOOD' 判断和 'wait_for_event()' 没有被互斥锁作为一个整体锁定。如果线程 1 在第一个“pthread_mutex_unlock(mx);”之后立即切换了上下文,线程 2 可以将“状态”更改为其他状态(坏?),并发出信号唤醒线程 1 继续在“状态 == GOOD”的逻辑中,我认为这是错误的。
但是为什么作者说'在这种情况下,线程 2 不会唤醒线程 1,线程 1 会继续休眠,可能永远。'?
不是'signal_event();'仍然在线程 2 中调用?我的理解完全正确吗?
【问题讨论】:
标签: linux operating-system linux-kernel