溫馨提示×

如何在C++中結合setevent實現線程同步

c++
小樊
99
2024-08-27 13:19:21
欄目: 編程語言

在C++中,可以使用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);  // 當前線程被阻塞,等待條件變量被通知
    }
    // 現在線程繼續執行
    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變量。如果readyfalse,線程將調用cv.wait(lck)進入等待狀態,此時線程會釋放互斥鎖并被阻塞。當go函數被調用時,ready變量被設置為true,并調用cv.notify_all()喚醒所有等待的線程。一旦線程收到通知,它將重新獲取互斥鎖并繼續執行。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女