pthreads:会等待并发信号通知一个未获得锁定信号的线程吗?

时间:2014-05-16 06:16:56

标签: 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)
//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的实例永远不会有机会运行。我的思维过程在这里是否正确?

1 个答案:

答案 0 :(得分:0)

我不这么认为。你的thread_1s和thread_2都有这段代码:

lock(mutex)
//RETURN RESOURCES
unlock(mutex)

它与thread_3有什么不同?

此外,在等待条件变量时不保持互斥锁,当线程被发出信号时,它将被线程重新获取。所以,在最坏的情况下,我们在这里有持续的锁争用。但除非线程具有不同的优先级,否则所有线程都有相同的机会饿死,不仅仅是thread_3,而是取决于锁之间的时间。但是如果饥饿确实占据了一席之地,那么试着使用一个公平的互斥体,例如:正如所描述的here