3執行緒同步-C++11中的條件變數
阿新 • • 發佈:2019-01-26
在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,等相關的函式來完成的。並沒有自旋,而是直接進入核心態。條件變數對執行緒間進行同步的時候,一般情況下自旋不會對效能帶來提高。而鎖只所以自旋是因為在很多情況下會帶來效能的提高,標準庫也沒有提供自旋多少次的設定,這也說明了標準庫不關注底層細節。是對機器一個更高層次的抽象,而降低程式設計難度。