想象一下线程阻塞条件变量:
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规范似乎没有说明这个案例。
答案 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调用没有优先级。