2

想象一个线程阻塞在条件变量上:

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 规范似乎对此案只字未提。

4

1 回答 1

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()。

(取自此链接

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

于 2012-10-03T15:55:22.090 回答