【发布时间】:2016-03-23 21:55:39
【问题描述】:
假设我们的线程看起来像这样:
线程1:
Lock(mutex) {
//code
if(something)
signal(condition_var);
//code
} //unlocks
线程2:
Lock(mutex) {
//code
while(something)
wait(mutex, condition_var);
//code
} //unlocks
1) 假设线程 1 中的信号被执行,然后在互斥锁解锁之前发生上下文切换。
2) 在 condition_var 上等待的线程 2 尝试继续,但互斥锁仍被锁定。现在它会继续等待我猜。假设上下文再次发生。
3) thread1 现在完成并解锁互斥锁。
现在线程 2 中的等待将如何表现,因为任何东西都不会再次发出信号,线程 2 将如何停止等待?
【问题讨论】:
-
当有人调用
signal()时,锁定的互斥锁不会阻止在条件变量上被唤醒。在这种情况下,线程不再等待条件变量,而是开始等待互斥体。当有人解锁互斥锁时(在您示例中的第 3 步),此等待结束。 -
是的,你是对的。我正在观看的视频讲座的虚假唤醒部分中提到了这一点。那个时候没看懂谢谢:)