欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

編程代碼
新聞詳情

C++ 線程間同步

發布時間:2021-03-29 09:36:33 最后更新:2021-03-30 09:02:29 瀏覽次數:4368

0 前言

  • 多線程在運行過程中,各個線程都是隨著 OS 的調度算法,占用 CPU 時間片來執行指令做事情,每個線程的運行完全沒有順序可言。
  • 在某些應用場景下,一個線程需要等待另外一個線程的運行結果,才能繼續往下執行,這就涉及到線程之間的同步通信機制。
  • 線程間同步通信最典型的例子就是生產者-消費者模型,生產者線程生產出產品以后,會通知消費者線程去消費產品;當消費者線程去消費產品時,發現還沒有產品生產出來,它需要通知生產者線程趕快生產產品,等生產者線程生產出產品以后,消費者線程才能繼續往下執行。

1 消費者“被動等待”

#include 
#include 
#include 

static std::mutex mtx;
static std::deque<int> dq;
static int productNum = 5;

void Producer()
{
    using namespace std::literals::chrono_literals;
    for (int i = 1; i <= productNum; ++i) {
        mtx.lock();
        dq.push_front(i);
        std::cout << "Producer 生產產品為: " << i << std::endl;
        mtx.unlock();
        // std::this_thread::sleep_for(1s);
    }
}

void Consumer()
{
    while (true) {
        if (dq.empty()) {
            continue;
        }
        mtx.lock();
        int data = dq.back();
        dq.pop_back();
        std::cout << "Consumer 消費產品為: " << data << std::endl;
        mtx.unlock();
    }
}

int main()
{
    std::thread t1(Producer);
    std::thread t2(Consumer);
    t2.join();
    t1.join();
    std::cin.get();
}

程序運行結果如下:

C++ 線程間同步

如果讓生產者線程每生產一個產品后休息(sleep) 1s,結果如下:

C++ 線程間同步

解釋:該例子中,生產者和消費者分別對應兩個線程。隊列中存在物品時,消費者去消費,否則空循環,一直等待。

缺點:當雙端隊列中沒有物品時,消費者只會原地死等,不會去催。

2 消費者“主動出擊”

#include 
#include 
#include 
#include 
#include 
  
std::mutex mtx;
std::condition_variable cv;
std::vector<int> vec;
int productNum = 5;

void Producer()
{
    for (int i = 1; i <= productNum; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        while (!vec.empty()) {
            cv.wait(lock); // vec 不為空時阻塞當前線程
        }
        vec.push_back(i);
        std::cout << "Producer生產產品: " << i << std::endl;
        cv.notify_all(); // 釋放線程鎖
    }
}

void Consumer()
{
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        while (vec.empty()) {
            cv.wait(lock); // vec 為空時等待線程鎖。其他線程鎖釋放時,當前線程繼續執行
        }
        int data = vec.back();
        vec.pop_back();
        std::cout << "Consumer消費產品: " << data << std::endl;
        cv.notify_all();
    }
}

int main()
{
    std::thread t1(Producer);
    std::thread t2(Consumer);
    t2.join();
    t1.join();
    std::cin.get();
}

程序運行結果如下:

C++ 線程間同步

解釋:該例子中,生產者和消費者分別對應兩個線程。只要 vector 中存在物品時,生產者線程就阻塞,通知消費者線程去消費;vector 中不存在物品時,消費者線程阻塞,通知生產者去生產。

3 線程加入方式 join 和 detach

join:采用 join 方式,t1、t2 亂序執行,且外層主線程會等到 t1、t2 都結束了再繼續執行后面的代碼。

detach:如果采用 detach 方式,t1、t2 亂序執行,且脫離了外層主線程。外層主線程執行結束時,t1、t2 可能還沒結束,但此時程序就退出了。


如涉及侵權,請相關權利人與我司聯系刪除

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 91一区二区三区四区五区| 性网站在线| 欧美精品v欧洲高清| 自怕偷自怕亚洲精品| 天天看大片特色视频.vr| 在线观看免费情网站大全| 欧美亚洲一区二区三区在线| 国产精品女同一区二区久久夜| 日韩欧美一区二区在线观看| 色婷婷亚洲五月色综合色| 国产三级日本三级在线播放| 国模精品视频一区二区三区| 2020国产微拍精品一区二区| 久久日本精品一区二区免费| 婷婷啪啪| 国产成人一区二区在线不卡| 欲色网站| 97欧美在线看欧美视频免费| 日日操狠狠干| 亚洲综合色区图片区| zzzzzzz中国美女| 不卡黄色| 日本高清二三四本2021| 亚洲欧美一区二区三区九九九| 性欧美videosg最新另类| 236宅宅免费网| 成人影院午夜久久影院| 国内精品久久久久久西瓜色吧 | 国产情侣真实露脸在线| 99久久国产综合精品麻豆| 国产精品一区二区国产| 精品国产免费观看久久久| 妞干网免费在线观看| 日产国产欧美视频一区精品| 午夜男人女人爽爽爽视频| 亚洲黄色影视| 亚洲精品美女久久久久| 亚洲欧美日韩国产专区一区| 亚洲一区免费| 亚洲欧美日韩国产综合| 亚洲欧美精品久久|