gpt4 book ai didi

linux - 关于之前的 'condition variable' 帖子

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:09 24 4
gpt4 key购买 nike

问题是关于我浏览过的关于条件变量的帖子。 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 可以将“状态”更改为其他内容(BAD?),并发出信号以唤醒线程 1 以继续在“state == GOOD”逻辑中,我认为这是错误的。

但为什么作者说“在这种情况下,线程 2 不会唤醒线程 1,而线程 1 将继续休眠,可能永远休眠。”?

不是“signal_event();”仍然在线程 2 中调用?我的理解完全正确吗?

最佳答案

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

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

pthread_mutex_unlock(mx);

wait_for_event();

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

关于linux - 关于之前的 'condition variable' 帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com