pthread_cond_wait()总能赢得锁定互斥锁的竞争吗?

这个问题与llnl中的pthread教程有关 。 说有三个主题。

线程1:

pthread_mutex_lock(&mutex) do_something... if condition pthread_cond_signal(&con) pthread_mutex_unlock(&mutex) repeat 

线程2:

 pthread_mutex_lock(&mutex) do_something... if condition pthread_cond_signal(&con) pthread_mutex_unlock(&mutex) repeat 

线程3:

 pthread_mutex_lock(&mutex) while(condition not holds) pthread_cond_wait(&con) do_something... pthread_mutex_unlock(&mutex) 

假设Thread1检查条件是否满足,然后发送信号以唤醒Thread3 。 最后它解锁了互斥锁。 但与此同时, 线程2正试图锁定互斥锁。

我的问题是:有没有保证Thread3将永远在竞争中获胜?

如果没有,则在Thread2 do_something …之后,可以更改条件变量,然后当Thread3锁定互斥锁时,条件变量与预期的不同。

我的问题是:有没有保证Tread3将永远在竞争中获胜?

没有这样的保证。 来自POSIX :

pthread_cond_signal()函数应解除阻塞在指定条件变量cond上阻塞的至少一个线程(如果在cond上阻塞了任何线程)。

如果在条件变量上阻塞了多个线程,则调度策略应确定线程被解除阻塞的顺序。 当由于pthread_cond_broadcast()或pthread_cond_signal()从pthread_cond_wait()或pthread_cond_timedwait()调用返回的每个线程解除阻塞时,该线程将拥有与其调用pthread_cond_wait()或pthread_cond_timedwait()的互斥锁。 未阻塞的线程将根据调度策略(如果适用)竞争互斥锁,并且好像每个都调用了pthread_mutex_lock()。

(强调我的)。

如果没有,则在Tread2 do_something …之后,可以更改条件变量,然后当Tread3锁定互斥锁时,条件变量与预期的不同。

如果线程的执行顺序很重要,那么您可能需要重写代码。

没有保证。 从pthread_cond_wait()返回应该被视为暗示条件可能已经改变,而不是它肯定有 – 所以你需要重新检查条件,并可能需要再次等待。 这正是为什么应该在检查条件的循环中调用pthread_cond_wait()原因。