当 thread1 发出信号时,等待条件的 thread2 如何唤醒,而 mutex(common) 仍被 thread1 锁定?
How will thread2, waiting on a condition, wake, when signalled from thread1, while mutex(common) is still locked by thread1?
假设我们的线程看起来像这样:
线程 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 将如何停止等待?
当条件变量发出信号时,等待该条件变量的线程将进入一种状态,在该状态下它正在尝试重新获取互斥锁,然后继续。在此之后不需要再次发出信号 - 如果最终释放了互斥量,它将继续(现在就像在等待锁定互斥量的正常尝试一样)。
假设我们的线程看起来像这样:
线程 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 将如何停止等待?
当条件变量发出信号时,等待该条件变量的线程将进入一种状态,在该状态下它正在尝试重新获取互斥锁,然后继续。在此之后不需要再次发出信号 - 如果最终释放了互斥量,它将继续(现在就像在等待锁定互斥量的正常尝试一样)。