iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

C++ 實務基礎經驗系列 第 25

併發相關 條件變數

  • 分享至 

  • xImage
  •  

併發相關 條件變數

今天來介紹條件變數,用來等待一個事件或條件的,比方說,在前面講mutex的章節中mutex可以用try_lock函數,去不斷確認能否上鎖,這個屬於忙碌等待busy wait,主動去確認條件,而今天講的條件變數就是個懶惰等待lazy wait,當事件或條件發生了,才會被通知去做接下來的事。

condition_variable

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中文是閂鎖是一個同步化物件,本質上就是個倒計時的計數器,當計數器為零時就能通過,是用於等待一系列事件的輕量級工具,不過latchC++20出來的函式庫,所以這次就先欠著。

barrier

barrier中文是屏障barrier是為了同步一群執行緒的可重複使用的同步化物件,一個假設場景是某個股票系統要每秒計算系統內每個用戶的浮動盈虧,分配多個執行緒,每個執行緒分別負責N個用戶,而每次計算浮動盈虧的時候,要等各執行緒的全部用戶都計算完,才能再算下一次,這時候就可以使用barrier,一樣barrierC++20才有,也是先欠著

參考

C++ 併發處理實戰


上一篇
併發相關 非同步
系列文
C++ 實務基礎經驗25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言