最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模式方式

 更新時間:2025年12月28日 09:24:44   作者:star-keke  
多線程工作池示例:創(chuàng)建固定數(shù)量的工作線程,通過條件變量競爭任務(wù)隊列,確保任務(wù)均勻分發(fā),任務(wù)隊列讀寫操作由互斥鎖保護(hù),避免競爭,使用`notify_one()`喚醒空閑線程,`notify_all()`停止時喚醒所有線程退出,適用于CPU/IO密集型任務(wù)

多線程工作池

  • 創(chuàng)建workerCount個工作線程(示例中為 3 個),每個線程執(zhí)行相同的workerLoop邏輯。
  • 線程通過condition_variable競爭任務(wù)隊列中的任務(wù),確保任務(wù)被均勻分發(fā)。

線程安全保障

  • 任務(wù)隊列的讀寫仍通過std::mutex保護(hù),避免多線程競爭導(dǎo)致的數(shù)據(jù)錯亂。
  • cv.notify_one()每次喚醒一個線程處理任務(wù),cv.notify_all()在停止時喚醒所有線程退出。

任務(wù)分發(fā)邏輯

  • 生產(chǎn)者(主線程)提交任務(wù)時,通過notify_one()喚醒空閑線程,避免線程忙等。
  • 多個工作線程同時消費(fèi)任務(wù),提升任務(wù)處理效率(尤其適合 CPU/IO 密集型任務(wù))。
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
#include <chrono>
#include <thread>
#include <vector>

// 任務(wù)隊列類型
using Task = std::function<void()>;

int main() {
    std::mutex mtx;
    std::condition_variable cv;
    std::queue<Task> taskQueue;
    bool stop = false; // 退出標(biāo)志
    const size_t workerCount = 3; // 工作線程數(shù)量
    std::vector<std::thread> workers; // 工作線程列表

    // ========== 工作線程循環(huán):多線程消費(fèi)任務(wù) ==========
    auto workerLoop = [&](int workerId) {
        while (true) {
            Task task;

            // 加鎖,獲取任務(wù)或檢測退出信號
            {
                std::unique_lock<std::mutex> lock(mtx);
                
                // 等待條件:有任務(wù) 或 需要停止
                cv.wait(lock, [&]() {
                    return !taskQueue.empty() || stop;
                });

                // 若停止且任務(wù)隊列為空,退出循環(huán)
                if (stop && taskQueue.empty()) {
                    std::cout << "[線程" << workerId << "] 退出工作循環(huán)..." << std::endl;
                    break;
                }

                // 取出隊列頭部任務(wù)(多線程競爭,確保線程安全)
                task = std::move(taskQueue.front());
                taskQueue.pop();
                std::cout << "[線程" << workerId << "] 取出任務(wù),準(zhǔn)備執(zhí)行..." << std::endl;
            } // 解鎖,避免執(zhí)行任務(wù)時持有鎖

            // 執(zhí)行任務(wù)
            if (task) {
                task();
            }
        }
    };

    // ========== 創(chuàng)建多個工作線程 ==========
    for (int i = 0; i < workerCount; ++i) {
        workers.emplace_back(workerLoop, i);
    }

    // ========== 模擬提交任務(wù)(生產(chǎn)者邏輯) ==========
    auto submitTask = [&](Task task) {
        std::lock_guard<std::mutex> lock(mtx);
        taskQueue.push(std::move(task));
        std::cout << "提交任務(wù),當(dāng)前隊列大小:" << taskQueue.size() << std::endl;
        cv.notify_one(); // 喚醒一個等待的工作線程
    };

    // 批量提交10個任務(wù)
    for (int i = 0; i < 10; ++i) {
        submitTask([i]() {
            std::cout << "執(zhí)行任務(wù)" << i << ":線程ID=" << std::this_thread::get_id() << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(200)); // 模擬任務(wù)耗時
        });
    }

    // 等待所有任務(wù)執(zhí)行(可選,也可通過隊列狀態(tài)判斷)
    std::this_thread::sleep_for(std::chrono::seconds(3));

    // ========== 停止所有工作線程 ==========
    {
        std::lock_guard<std::mutex> lock(mtx);
        stop = true;
        cv.notify_all(); // 喚醒所有等待的線程,確保全部退出
        std::cout << "\n通知所有線程停止..." << std::endl;
    }

    // 等待所有工作線程結(jié)束
    for (auto& worker : workers) {
        if (worker.joinable()) {
            worker.join();
        }
    }

    std::cout << "程序結(jié)束" << std::endl;
    return 0;
}

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++新特性詳細(xì)分析基于范圍的for循環(huán)

    C++新特性詳細(xì)分析基于范圍的for循環(huán)

    C++11這次的更新帶來了令很多C++程序員期待已久的for?range循環(huán),每次看到j(luò)avascript,?lua里的for?range,心想要是C++能有多好,心里別提多酸了。這次C++11不負(fù)眾望,再也不用羨慕別家人的for?range了。下面看下C++11的for循環(huán)的新用法
    2022-04-04
  • C++詳細(xì)講解內(nèi)存管理工具primitives

    C++詳細(xì)講解內(nèi)存管理工具primitives

    文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實(shí)例、應(yīng)用技巧、基本知識點(diǎn)總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2022-06-06
  • 詳解c++實(shí)現(xiàn)信號槽

    詳解c++實(shí)現(xiàn)信號槽

    這篇文章主要為大家介紹了c++實(shí)現(xiàn)信號槽,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法

    C語言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法

    這篇文章主要介紹了C語言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法,講解了以不同進(jìn)制將整型數(shù)字轉(zhuǎn)換成字符數(shù)組,需要的朋友可以參考下
    2016-04-04
  • 帶你了解C++初階之引用

    帶你了解C++初階之引用

    這篇文章主要為大家介紹了C++初階之引用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟

    dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟

    本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++版圖書管理系統(tǒng)

    C++版圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++版圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 海量數(shù)據(jù)處理系列之:用C++實(shí)現(xiàn)Bitmap算法

    海量數(shù)據(jù)處理系列之:用C++實(shí)現(xiàn)Bitmap算法

    本篇文章是對用C++實(shí)現(xiàn)Bitmap算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++多態(tài)定義及實(shí)現(xiàn)深度剖析

    C++多態(tài)定義及實(shí)現(xiàn)深度剖析

    多態(tài)也是面向?qū)ο蟪绦蛟O(shè)計的重要特性,它都是配合繼承來使用,多態(tài)可以增加程序設(shè)計的靈活性,這篇文章主要介紹了C++多態(tài)定義及實(shí)現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • C語言單鏈表遍歷與求和示例解讀

    C語言單鏈表遍歷與求和示例解讀

    我們在學(xué)習(xí)編程的過程中,雖然有些語法很簡單,但是我們還是要做多題。不做題是發(fā)現(xiàn)不了問題的,發(fā)現(xiàn)問題我們就可以“對癥下藥”,進(jìn)行查漏補(bǔ)缺了。刷題可以先從簡單題開始刷,熟練之后再做一些可以提升自己能力的題
    2022-07-07

最新評論

日土县| 尖扎县| 永德县| 平罗县| 旅游| 甘德县| 水富县| 永昌县| 梓潼县| 鄂伦春自治旗| 砚山县| 湖南省| 白沙| 崇明县| 徐闻县| 绥中县| 麻江县| 靖州| 寻乌县| 宜都市| 竹山县| 乌什县| 五峰| 巢湖市| 福泉市| 宁南县| 色达县| 灵山县| 博罗县| 罗江县| 兴和县| 静宁县| 安西县| 进贤县| 措美县| 周口市| 卓资县| 琼海市| 西城区| 射洪县| 滦平县|