91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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

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

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

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

#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 之后,
    }
    // 現在線程繼續執行
    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;
}

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

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

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

0
同心县| 镇原县| 长海县| 信宜市| 沧州市| 连南| 墨竹工卡县| 赣州市| 濉溪县| 林西县| 曲周县| 深圳市| 和平区| 荥阳市| 兴业县| 扶风县| 镇宁| 鸡东县| 遂溪县| 潞西市| 通道| 民勤县| 通州区| 酒泉市| 湟中县| 三穗县| 广东省| 高唐县| 安国市| 龙山县| 石狮市| 岫岩| 比如县| 太和县| 叶城县| 普定县| 江西省| 治多县| 金坛市| 田阳县| 甘泉县|