说我有3种类型的线程:
//Thread_1:
lock(mutex)
while(t1_unexceptable_cond){
wait(t1_cv, mutex);
}
//TAKE RESOURCES
if(should_signal_T2){
signal(t2_cv, mutex)
} else {
signal(t1_cv, mutex)
}
unlock(mutex)
//DO THINGS WITH RESOURCES
lock(mutex)
//RETURN RESOURCES
unlock(mutex)
//Thread_2:
lock(mutex)
while(t2_unexceptable_cond){
wait(t2_cv, mutex);
}
//ACQUIRE RESOURCES
if(should_signal_T2){
signal(t2_cv, mutex)
} else {
signal(t1_cv, mutex)
}
unlock(mutex)
//DO THINGS WITH RESOURCES
lock(mutex)
//RETURN RESOURCES
unlock(mutex)
//Thread_3:
lock(mutex)
//DO THINGs
unlock(mutex)
如果我有一系列thread_1和thread_2等待互斥锁,那么thread_3会因为其他线程被发出信号而饿死吗?我会假设其他线程会在唤醒时首先进行,因此thread_3的实例永远不会有机会运行。我的思维过程在这里是否正确?
答案 0 :(得分:0)
我不这么认为。你的thread_1s和thread_2都有这段代码:
lock(mutex)
//RETURN RESOURCES
unlock(mutex)
它与thread_3有什么不同?
此外,在等待条件变量时不保持互斥锁,当线程被发出信号时,它将被线程重新获取。所以,在最坏的情况下,我们在这里有持续的锁争用。但除非线程具有不同的优先级,否则所有线程都有相同的机会饿死,不仅仅是thread_3,而是取决于锁之间的时间。但是如果饥饿确实占据了一席之地,那么试着使用一个公平的互斥体,例如:正如所描述的here