今天來介紹條件變數,用來等待一個事件或條件的,比方說,在前面講mutex
的章節中mutex
可以用try_lock
函數,去不斷確認能否上鎖,這個屬於忙碌等待busy wait
,主動去確認條件,而今天講的條件變數就是個懶惰等待lazy wait
,當事件或條件發生了,才會被通知去做接下來的事。
condition_variable
就是條件變數,能讓當前的線程等待一個事件或條件,參考下面例子
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
using namespace std;
mutex mtx;
condition_variable cv;
bool ready = false;
void Work_thread()
{
while (true)
{
// condition_variable 需要搭配unique_lock一起使用
unique_lock<mutex> lk(mtx);
// wait需要mutex
// cv.wait(lk);
// 有條件地等待使用,在wait第二個參數加上lambda函式,為true的時候才會通過
cv.wait(lk, []{return ready;});
cout << this_thread::get_id() << " awake!\n";
ready = false;
}
}
void Prepare_thread()
{
while (true)
{
{
lock_guard<mutex> lk(mtx);
ready = true;
cout << this_thread::get_id() << " ready to notify!\n";
}
// notify_one是喚醒第一個等待的cv,notify_all是喚醒全部等待的cv
cv.notify_one();
this_thread::sleep_for(chrono::milliseconds(1000));
}
}
int main(int argc, char const *argv[])
{
thread t1(Work_thread);
thread t2(Prepare_thread);
t1.join();
t2.join();
return 0;
}
latch
中文是閂鎖
是一個同步化物件,本質上就是個倒計時的計數器,當計數器為零時就能通過,是用於等待一系列事件的輕量級工具,不過latch
是C++20
出來的函式庫,所以這次就先欠著。
barrier
中文是屏障
,barrier
是為了同步一群執行緒的可重複使用的同步化物件,一個假設場景是某個股票系統要每秒計算系統內每個用戶的浮動盈虧,分配多個執行緒,每個執行緒分別負責N個用戶,而每次計算浮動盈虧的時候,要等各執行緒的全部用戶都計算完,才能再算下一次,這時候就可以使用barrier
,一樣barrier
是C++20
才有,也是先欠著