同步控制 condition variable

2021-10-20 17:36:34 字數 2210 閱讀 7134

條件變數(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 解除設定,被阻塞的執行緒可以繼續執行...