1. 程式人生 > >3執行緒同步-C++11中的條件變數

3執行緒同步-C++11中的條件變數

在C11標頭檔案<condition_variable>中包含了如下內容

cv_status

條件等待結果的列舉。

condition_variable

條件變數的主要類,用於實現執行緒同步。

condition_variable_any

是對condition_variable的擴充套件,condition_variable只能等待unique_lock<mutex>。

notify_all_at_thread_exit

函式,當執行緒退出的時候,給所有在等待條件上的執行緒發出通知。

這就是C++11中條件變數的全部。

C11中的條件變數在linux 平臺上的實現

就是對pthread_cond_*物件的封裝,具備了pthread_con的所有特性。

C11中的條件變數在win 平臺上的實現

跟蹤wait函式如下呼叫堆疊


沒有旋轉而直接進入了核心態,通過WaitForSingleObjectEx完成等待。

通過跟蹤notify_all函式得到如下呼叫堆疊


通知執行緒開始工作是用SetEvent函式來彎沉的。

總結:

C11的條件變數同步在win下是靠CreateEvent,SetEvent,WaitForSingleObject,等相關的函式來完成的。並沒有自旋,而是直接進入核心態。條件變數對執行緒間進行同步的時候,一般情況下自旋不會對效能帶來提高。而鎖只所以自旋是因為在很多情況下會帶來效能的提高,標準庫也沒有提供自旋多少次的設定,這也說明了標準庫不關注底層細節。是對機器一個更高層次的抽象,而降低程式設計難度。