【问题标题】:How will thread2, waiting on a condition, wake, when signalled from thread1, while mutex(common) is still locked by thread1?当线程 1 发出信号时,等待条件的线程 2 将如何唤醒,而互斥锁(通用)仍被线程 1 锁定?
【发布时间】: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 步),此等待结束。
  • 是的,你是对的。我正在观看的视频讲座的虚假唤醒部分中提到了这一点。那个时候没看懂谢谢:)

标签: multithreading pthreads


【解决方案1】:

当条件变量发出信号时,等待该条件变量的线程将进入尝试重新获取互斥锁然后继续的状态。在此之后不需要再次发出信号 - 如果互斥锁最终被释放,它将继续(现在就像它在正常尝试锁定互斥锁一样等待)。

【讨论】:

  • 通常也不需要在发信号时保持锁定。这避免了唤醒另一个线程只是为了阻止它获取互斥锁。
猜你喜欢
  • 2015-07-05
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多