溫馨提示×

如何在C++中使用notify通知機制

c++
小樊
87
2024-08-29 07:24:36
欄目: 編程語言

在 C++ 中,std::condition_variable 提供了一種線程間的通信機制,可以用來實現(xiàn)線程同步

下面是一個簡單的示例,展示了如何使用 std::condition_variablestd::mutex 實現(xiàn)多線程之間的通知機制:

#include<iostream>
#include<thread>
#include <mutex>
#include<condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id(int id) {
    std::unique_lock<std::mutex> lck(mtx);
    while (!ready) {  // 如果 ready 為 false, 則等待
        cv.wait(lck);  // 當前線程被阻塞, 當全局變量 ready 變成 true 之后,
    }
    // 現(xiàn)在線程繼續(xù)執(zhí)行
    std::cout << "thread " << id << '\n';
}

void go() {
    std::unique_lock<std::mutex> lck(mtx);
    ready = true;  // 修改全局變量
    cv.notify_all();  // 喚醒所有線程
}

int main() {
    std::thread threads[10];
    // spawn 10 threads:
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(print_id, i);

    std::cout << "10 threads ready to race...\n";
    go();  // go!

    for (auto &th : threads) th.join();

    return 0;
}

在這個示例中,我們創(chuàng)建了 10 個線程,每個線程都會執(zhí)行 print_id 函數(shù)。這些線程在開始時會獲取互斥鎖并檢查全局變量 ready 是否為 true。如果 ready 不是 true,線程將調(diào)用 cv.wait(lck) 進入等待狀態(tài),同時釋放互斥鎖以便其他線程可以獲取該鎖。

主線程調(diào)用 go 函數(shù),該函數(shù)獲取互斥鎖、設置全局變量 readytrue,然后調(diào)用 cv.notify_all() 來喚醒所有等待的線程。注意,在調(diào)用 notify_all() 之前必須擁有互斥鎖,以確保喚醒的線程能夠立即獲取互斥鎖并繼續(xù)執(zhí)行。

這個示例展示了如何使用條件變量和互斥鎖來實現(xiàn)線程間的通知機制。當然,在實際應用中,你可能需要根據(jù)具體情況對代碼進行調(diào)整。

0