在pthread_cond_wait()取消阻塞之前,pthread_mutex_lock()是否可以解锁?

时间:2012-10-03 15:43:34

标签: c multithreading mutex condition-variable

想象一下线程阻塞条件变量:

pthread_mutex_lock (mutex);
do_something ();
pthread_cond_wait(cond, mutex); // [1]
do_something_else ();
pthread_mutex_unlock (mutex);

互斥锁已解锁,另一个试图锁定互斥锁的线程被解锁:

pthread_mutex_lock (mutex);
do_some_work ();
pthread_cond_signal (cond);
pthread_mutex_unlock (mutex);

同时还有另一个线程在等待获得关键部分的所有权:

pthread_mutex_lock (mutex); // [2]
do_some_random_work ();
pthread_mutex_unlock (mutex);

现在,问题是:当调用pthread_cond_signal()时,是否保证pthread_cond_wait()[1]在pthread_mutex_lock()[2]之前解锁?

POSIX规范似乎没有说明这个案例。

1 个答案:

答案 0 :(得分:5)

不,不是。

pthread_cond_signal()的描述有时表示为

  

当每个线程因pthread_cond_signal()或pthread_cond_broadcast()而被解除阻塞时   从调用pthread_cond_wait()或pthread_cond_timedwait()返回,该线程拥有   用于调用pthread_cond_wait()或pthread_cond_timedwait()的互斥锁。线程   根据调度策略(如果适用),未阻塞的互斥锁竞争互斥锁,   就好像每个人都调用了pthread_mutex_lock()。

(取自this link

正如你所看到的,它的措辞是“好像每个人都调用了pthread_mutex_lock()”。因此,与来自另一个线程的实际pthread_mutex_lock调用相比,这个隐含的pthread_mutex_lock调用没有优先级。