条件変数のスレッド ブロックを想像してください。
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仕様は、ケースについて何も言っていないようです。