【问题标题】:Something regarding a previous 'condition variable' post关于以前的“条件变量”帖子的一些事情
【发布时间】: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


    【解决方案1】:

    该错误是由signal_event()wait_for_event() 的语义引起的。如果在wait_for_event()没有卡住的情况下调用signal_event(),则信号丢失。

    除了上下文切换,如果线程 2 运行快而线程 1 慢,也会出现同样的问题。在这种情况下,线程 1 中的时间

    pthread_mutex_unlock(mx);
    

    wait_for_event();
    

    可能是当 thread2 完成所有操作时,将信号发送到遗忘状态(因为没有人在等待它)。然后线程 1 等待,它永远不会收到信号(除非线程 2 出于某种原因再次运行)。

    【讨论】:

    • 谢谢沃利克。很高兴知道。对于这种 wait_for_event()/signal_event() 语义情况,真正的 linux 函数名称是什么?我是新手,目前只看了一本书的信号处理程序章节。
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多