2011-03-03 89 views
5

假設某個條件變量「cond」與一個互斥變量「mutex」關聯。如果一個線程在調用pthread_cond_wait(&cond,&mutex)之後正在睡眠cond,並且鎖定的另一個線程完成鎖定,那麼在調用pthread_mutex_unlock(&mutex)之前還是之後,該線程調用pthread_cond_signal(&cond)是否有關係?如果它調用pthread_cond_signal(&cond),它甚至需要解鎖互斥鎖,因爲睡眠線程無論如何都會獲取互斥鎖?發送條件變量(pthreads)

編輯:根據https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview,「在調用pthread_cond_signal()後未能解鎖互斥鎖可能無法完成匹配的pthread_cond_wait()例程(它將保持阻塞狀態)。」我想那時候,解鎖,也許只有在之後,纔是必需的。

+0

+1回答你自己的問題。 – 2011-03-03 01:44:46

回答

3

調用pthread_cond_signal之後,您應該始終解鎖互斥鎖。這裏有一些很好的問題/解答閱讀:

Calling pthread_cond_signal without locking mutex

它不會來找我的權利,但我敢肯定有,你不要一個很好的理由(在比賽條件而言)在發送信號之前,您想解鎖互斥鎖。

+0

如果在發信號通知條件變量並解鎖互斥鎖之後,線程會立即在該互斥鎖上調用'pthread_mutex_lock()',它是否保證不會餓死先前由'pthread_cond_signal()'喚醒的線程? – ManRow 2011-03-03 03:45:13

+1

@ManRow:如果設置了正確的優先級,那麼Priority Scheduling選項中可能會有這樣的保證。否則,絕對不是。 – 2011-03-03 03:53:00

+2

好的原因是避免優先級倒置:http://groups.google.com/group/comp.programming.threads/msg/a3721a2fc9b21c64?hl=ky從http://stackoverflow.com/questions/4544234/calling-並行線程-COND - 信號 - 不鎖定-互斥/ 4544494#4544494 – ninjalj 2011-03-15 23:43:46

4

如果保持互斥鎖定,則被喚醒的線程無法獲取互斥鎖,因此將在pthread_cond_wait中等待重新獲取互斥鎖。

您不需要鎖定互斥鎖就可以調用pthread_cond_signal。事實上,如果您的應用程序邏輯可以在互斥鎖未鎖定的情況下使用信號,那麼這是一種更好的方法 - 操作系統可以立即安排等待的線程,並且不必等待信號在繼續之前解鎖互斥體。

但是,在這種情況下,必須注意確保喚醒不會丟失,並且您不會遇到「錯誤」線程被喚醒的問題。如果你使用直接謂詞,這在實踐中應該不成問題。