Multithreading pthreads:等待和发信号是否会使没有收到获取锁信号的线程饥饿?

Multithreading pthreads:等待和发信号是否会使没有收到获取锁信号的线程饥饿?,multithreading,pthreads,Multithreading,Pthreads,假设我有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) //RET

假设我有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)

如果我有一系列线程1和线程2等待互斥锁,那么一个线程3会因为其他线程收到信号而饿死吗?我假设其他线程在醒来时会先运行,因此线程3的实例永远不会有机会运行。我的思维过程在这里正确吗?

我不这么认为。您的线程1和线程2都有以下代码:

lock(mutex)
//RETURN RESOURCES
unlock(mutex)
它和线程3有什么不同

另外,在等待条件变量时,互斥锁不会被保持,当它收到信号时,线程将重新获取互斥锁。所以,在最坏的情况下,我们这里有连续的锁争用。但是,除非线程具有不同的优先级,否则所有线程都有相同的饿死机会,这不仅取决于线程3,还取决于锁之间的计时。但是如果饥饿真的发生了,试着使用一个公平的互斥,例如如上所述