2017-05-27 51 views
0

Quoting POSIX可以假定``pthread_cond_signal``會以條件變量的互斥鍵的方式自動喚醒信號線程?

pthread_cond_broadcast()pthread_cond_signal()功能可以由一個線程它是否當前擁有那個線程調用pthread_cond_wait()pthread_cond_timedwait()已經與在其等待狀態變量相關聯的互斥被調用;然而,如果需要可預測的調度行爲,那麼該互斥量將被調用pthread_cond_broadcast()pthread_cond_signal()的線程鎖定。

「如果可預測的調度行爲是必需的」。這可能/會暗示在調用pthread_cond_signal()之前鎖定綁定到條件變量的互斥鎖應確保在任何其他線程設法鎖定此互斥鎖之前喚醒信號線程。它是否正確?

回答

0

如果有任何PThreads專家有更全面的答案,但至少在Linux手冊頁中,至少在我看來,您不會得到完全可預測的行爲。你得到的是一個保證,如果兩個線程在同一個條件變量上等待,那麼更高級的線程將首先進入(至少,如果一個線程是SCHED_OTHER而另一個線程是實時SCHED_FIFO,那麼在Linux上應該是這樣的)。如果您在發送信號之前鎖定互斥鎖(在快速閱讀聯機幫助頁面後保留錯誤),則這種情況仍然存在。

https://linux.die.net/man/3/pthread_cond_signal

+0

我推薦這裏的官方Linux手冊頁:http://man7.org/linux/man-pages/man3/pthread_cond_signal.3p.html – alk

0

沒有,也不能保證在信號線程將被喚醒。更糟的是,如果在信號線必須序列:

while(run_again) { 
    pthread_mutex_lock(&mutex); 
    /* prepare data */ 
    pthread_mutex_unlock(&mutex); 
    pthread_cond_broadcast(&cond); 
} 

有合理的機會,控制永遠不會被傳遞給其他線程等待,因爲在調度邏輯上mutex。一些與你玩的例子可以在this answer找到。