2012-10-03 41 views
2

設想一個條件變量線程塊:可以在pthread_cond_wait()解除阻止之前解鎖pthread_mutex_lock()嗎?

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規範似乎沒有提到這種情況。

回答

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調用沒有優先級。

+0

+1我的想法正好。 – Tudor

相關問題