一、std::condition_variable
用在多線程中。
線程A:等待一個條件滿足
線程B:專門在消息隊列中扔消息,線程B觸發了這個條件,A就滿足條件了,可以繼續執行
std::condition_variable my_cond;//生成一個條件對象
wait()是條件變量的成員函數,用來等一個東西,如果第二個參數lambda表達式返回值是false,那么wait將解鎖第一個參數(互斥量),並堵塞到本行。
堵塞到什么時候呢?堵塞到其他某個線程調用notify_one()成員函數為止。如果返回true,那么wait()直接返回。
如果沒有第二個參數,就跟默認第二個參數返回false效果一樣。
my_cond.notify_one();//嘗試吧wait的線程喚醒,執行完這行,wait就被喚醒了
只能通知一個線程,如果兩個線程干的不同的事情,都卡在wait,怎么喚醒多個線程?notify_all,這兩個線程只有一個線程能獲取到鎖,另一個沒拿到鎖,就一直不斷的去獲得鎖
當其他notify_one()將wait喚醒之后,wait不斷嘗試獲取互斥量鎖,如果獲取不到,流程就卡在wait這里等着獲取。如果獲取到了,wait就獲取到鎖(就等於上鎖);
(1)如果wait有第二個參數(lambda),就判斷這個表達式,如果lambda為false,那么流程如上,又休眠,再等待喚醒;
(2)如果表達式為true,那么wait返回,流程走下來(此時互斥量鎖還是鎖着的),流程只要能走到這里來,這個互斥量鎖一定是鎖着的。
(3)如果沒有第二個參數,wait就返回,流程走下來
加入A線程正在處理一個事物 ,需要一段時間,並沒有卡在wait等你喚醒,那么B線程調用notify_one就沒有效果了。
A線程notify_one之后,可能會接着lock,而另一個線程可能也在lock,兩個線程誰先拿到鎖不一定,所以競爭鎖問題出現了。