條件變數(condition_variable)用來實現多執行緒間的同步操作,控制多個執行緒的執行順序。
操作作用
conditon_variable cv
預設建構函式
~conditon_variable()
析構函式
cv.notify_one()
喚醒乙個等待執行緒,若沒有等待執行緒,通知則被丟棄。
cv.notify_all()
喚醒所有等待執行緒
cv.wait(ul)
使用unique_lock來等待通知
cv.wait(ul, pred)
使用unique_lock來等待通知,直到喚醒時pred結果為true
cv.wait_for(ul, duration)
在duration時間內使用unique_lock來等待通知
cv.wait_for(ul, duration, pred)
在duration時間內使用unique_lock來等待通知,或直到喚醒時pred結果為true
cv.wait_until(ul, timepoint)
在timepoint時間點前使用unique_lock來等待通知
cv.wait_until(ul, timepoint, pred)
在timepoint時間點前使用unique_lock來等待通知,或直到喚醒時pred結果為true
例子
queue<
int> queue;
mutex quemutex;
condition_variable quecv;
void
provider
(int val)
quecv.
notify_one()
; this_thread.
sleep_for
(chrono::
milliseconds
(val));
}}void
consumer
(int num));
val = queue.
front()
; queue.
pop();
}}}int
main()
條件變數只是負責多執行緒的同步控制,資源的競爭訪問還需要互斥鎖,條件變數內部實現也使用了unique_lock。所以條件變數總是和互斥鎖一起使用。
需要注意的是,**中通知函式notify前使用的是lock_guard,而等待函式wait前使用的是unique_lock。
quecv.
notify_one()
;
unique_lock
ul(quemutex)
;quecv.
wait
(ul,
);
unique_lock相比lock_guard更加靈活。lock_guard只能在建構函式中加鎖,在析構函式中解鎖;而unique_lock還可以在需要時呼叫lock或unlock進行加鎖、解鎖操作。等待函式wait阻塞時,會呼叫unique_lock的unlock函式釋放鎖,以使其他執行緒有機會獲取鎖。
另乙個需要注意的是條件變數的虛假喚醒。虛假喚醒是指,由於作業系統的原因,條件變數的wait操作可能在條件變數未被notify通知時返回。所以需要進行二次檢查。
quecv.
wait
(ul,
);
wait函式內部會在條件變數被喚醒時呼叫第二實參,當它返回true時才會返回,否則再次進行等待。相當於:
while
(queue.
empty()
)
另外,如果呼叫wait時第二實參的返回值是true,那麼wait不會等待而是馬上返回。下面**不呼叫notify函式也能正常執行。
auto lmb =
);std::cout <<
"test condition variable wait"
<< std::endl;};
std::future<
void
> f = std::
async
(std::launch::async, lmb);f.
get(
);
Linux中同步控制
一 互斥鎖 1 概念 實現執行緒訪問臨界資源的同步控制。如果乙個執行緒在臨界區開始時,給互斥鎖加鎖,那麼其他的執行緒就必須等待執行緒解鎖,才能接著執行,並訪問資源。操作 初始化,加鎖,解鎖,銷毀鎖 2 互斥鎖型別 pthread mutex t 3 鎖初始化 int pthread mutex in...
程序同步控制
生產者 消費者問題描述的是 有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能夠併發執行,在兩者之間設定了乙個具有n個緩衝區的緩衝池,生產者程序將它所生產的產品放入乙個緩衝區中 消費者程序可以從乙個緩衝區中取走產品去消費。儘管所有的生產者和消費者程序都是以非...
Python 多執行緒 同步控制 同步物件
當多執行緒同時開始執行的時候,是沒有先後順序的,誰先搶到執行權誰就先執行。通過event物件可以控制線程優先執行權。event threading.event event.wait event 被設定,執行緒則阻塞不再繼續執行下去 event.set event 解除設定,被阻塞的執行緒可以繼續執行...