C++多生產者,多消費者模型

C++11實現多生產者,多消費者模型

在C++標準庫中實現多生產者多消費者模型,可以使用std::thread、std::queue、互斥鎖(std::mutex)、條件變量(std::condition_variable)等組件。下面是一個簡單的示例,展示如何創建多生產者和多消費者模型,并使用線程池的概念來限制線程的數量(雖然C++標準庫沒有直接提供線程池,但可以手動管理線程來模擬)。

main.cpp:

using namespace std;
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>std::queue<int> producedData;
std::mutex mtx;
std::condition_variable cv;void producer(int id, int itemsToProduce) {for (int i = 0; i < itemsToProduce; ++i) {std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模擬生產時間std::lock_guard<std::mutex> lock(mtx);std::cout << "Producer " << id << " produced " << i << std::endl;producedData.push(i);cv.notify_one(); // 通知消費者有新數據}
}void consumer(int id) {while (true) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{return !producedData.empty();}); // 等待直到隊列非空int data = producedData.front();producedData.pop();lock.unlock();std::cout << "Consumer " << id << " consumed " << data << std::endl;if (data == 4) { // 假設每個生產者生產5個數據,消費者在消費完后退出break;}}
}int main()
{constexpr int numProducers = 2;constexpr int numConsumers = 2;constexpr int itemsPerProducer = 5;// 啟動生產者線程std::vector<std::thread> producers;for (int i = 0; i < numProducers; ++i) {producers.emplace_back(producer, i, itemsPerProducer);}// 啟動消費者線程std::vector<std::thread> consumers;for (int i = 0; i < numConsumers; ++i) {consumers.emplace_back(consumer, i);//在第i個之后追加consumer}// 等待所有生產者線程完成for (auto& t : producers) {t.join();}// 發出結束信號給消費者(在本例中,通過生產的特定數量來隱式完成)// 注意:真實應用中可能需要更明確的結束信號機制// 等待所有消費者線程完成for (auto& t : consumers) {t.join();}return 0;
}

運行效果:
在這里插入圖片描述
后續優化:
在實際應用中,可能還需要考慮更多的異常處理邏輯、線程安全、資源管理等問題,以及根據具體需求調整線程的創建和管理策略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15141.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3款錄屏錄制軟件,打造專業級視頻內容

隨著技術的不斷發展&#xff0c;人們在日常工作和學習中經常會遇到記錄電腦屏幕的需求&#xff0c;例如錄制游戲過程、制作教程、保存會議記錄等。為了解決這一需求&#xff0c;許多錄屏錄制軟件應運而生。本文將介紹三款常見的錄屏錄制軟件&#xff0c;通過分析它們的特點和使…

一文帶你搞懂DiT(Diffusion Transformer)

節前&#xff0c;我們組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、今年參加社招和校招面試的同學。 針對大模型技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備面試攻略、面試常考點等熱門話題進行了深入的討論。 總結鏈接…

ArcGIS中分割與按屬性分割的區別

1、分割ArcGIS批量導出各個市的縣級行政邊界 視頻教學&#xff1a; ArcGIS批量導出各個市的縣級行政邊界002 2、ArcGIS批量導出全國各省的邊界 視頻教學&#xff1a; ArcGIS導出全國各省的邊界003 推薦學習&#xff1a; ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回…

[書生·浦語大模型實戰營]——第二節:輕松玩轉書生·浦語大模型趣味 Demo

1. 部署InternLM2-Chat-1.8B 模型進行智能對話 1.1配置環境 創建開發機 Intern Studio 官網網址&#xff1a;https://studio.intern-ai.org.cn/ 進入官網后&#xff0c;選擇創建開發機&#xff0c;填寫 開發機名稱 后&#xff0c;點擊 選擇鏡像 使用 Cuda11.7-conda 鏡像&am…

CSS中的Flex布局

目錄 一.什么是Flex布局 二.Flex布局使用 2.1Flex使用語法 2.2基本概念 三.容器的屬性 3.1所有屬性概述 3.2flex-direction 3.3flex-wrap 3.4flex-flow 3.5justify-content 3.6align-items 3.7align-content 四.項目(子元素)的屬性 4.1所有屬性概述 4.2order 4…

遺傳算法(Genetic Algorithm, GA)哪些步驟該丟給GPU

遺傳算法&#xff08;Genetic Algorithm, GA&#xff09;是一種啟發式搜索算法&#xff0c;受到生物進化的啟發。在遺傳算法中&#xff0c;種群中的每個個體代表問題的一個候選解&#xff0c;通過迭代選擇、交叉和變異操作&#xff0c;來模擬自然選擇和遺傳過程&#xff0c;從而…

九、OpenAI之圖片生成(Image generation)

學習用DALL.E的API怎樣生成和操作圖片 1 介紹 圖片API提供3個方法來和圖片進行交互&#xff1a; 從0開始基于文字提示創建圖片(DALL.E 3 and DALL.E2)基于一個新的提示詞&#xff0c;通過讓模型替換已有圖像的某些區域來創建圖像的編輯版本;&#xff08;DALL.E2&#xff09;…

【FPGA】Verilog:解碼器 | 編碼器 | 多路復用器(Mux, Multiplexer)

0x00 什么是解碼器 解碼器是根據輸入信號在多個輸出位中選擇一個輸出位的裝置。例如,當解碼器接收2位二進制值作為輸入時,它可以接收00、01、10、11四種輸入值,并根據每個輸入值在4個輸出位中選擇一個,輸出為1000、0100、0010、0001中的一種。這樣的解碼器被稱為高電平有效…

ICML 2024 Mamba 論文總結

2024ICML&#xff08;International Conference on Machine Learning&#xff0c;國際機器學習會議&#xff09;在2024年7月21日-27日在奧地利維也納舉行 &#x1f31f;【緊跟前沿】“時空探索之旅”與你一起探索時空奧秘&#xff01;&#x1f680; 歡迎大家關注時空探索之旅 …

【數據結構與算法 | 基礎篇】數組模擬棧

1. 前言 前文我們剛提及了如何用單向鏈表來模擬棧. 我們還可以用數組來模擬棧.使用棧頂指針top來進行棧頂的操作. 2. 數組模擬棧 (1). 棧接口 public interface stack<E> {//壓棧boolean push(E value);//彈棧, 棧非空返回棧頂元素E pop();//返回棧頂元素, 但不彈棧E…

IntelliJ IDEA常用快捷鍵 + 動圖演示!

本文參考了 IntelliJ IDEA 的官網&#xff0c;列舉了IntelliJ IDEA &#xff08;Windows 版&#xff09; 的所有快捷鍵。并在此基礎上&#xff0c;為 90% 以上的快捷鍵提供了動圖演示&#xff0c;能夠直觀的看到操作效果。 該快捷鍵共分 11 種&#xff0c;可以方便的按各類查找…

【通義千問—Qwen-Agent系列2】案例分析(圖像理解圖文生成Agent||多模態助手|| 基于ReAct范式的數據分析Agent)

目錄 前言一、快速開始1-1、介紹1-2、安裝1-3、開發你自己的Agent 二、基于Qwen-Agent的案例分析2-0、環境安裝2-1、圖像理解&文本生成Agent2-2、 基于ReAct范式的數據分析Agent2-3、 多模態助手 附錄1、agent源碼2、router源碼 總結 前言 Qwen-Agent是一個開發框架。開發…

Excel提取某一列的唯一值

點擊【篩選】&#xff08;【高級篩選】&#xff09;&#xff0c;參數里&#xff1a; 列表區域&#xff1a;為需要選擇唯一值的那一列復制到&#xff1a;生成唯一值的目標區域 據說新版本的excel有了unique()函數&#xff0c;可以很快捷的選擇某一列的唯一值&#xff0c;但是博…

儀器校準中移液器的使用規范,應當注意哪些細節?

校準行業中&#xff0c;移液器的使用是非常多的&#xff0c;尤其是理化室&#xff0c;經常需要借助到移液器來校準。作為常規的溶液定量轉移器具&#xff0c;其在校準過程中的使用也需要遵守規范&#xff0c;既是保證校準結果準確低誤差&#xff0c;也是為了規范實驗室校準人員…

類與對象:接口

一.概念 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xff0c;在JAVA編程語言中是一個抽象類型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface來聲明。 二.語法規則 與定義類相似&#xff0c;使用interface關鍵詞。 Idea可以在開始時直接創建…

高德地圖PlaceSearch標記點清除

在開發過程中發現引入 AMap.PlaceSearch 插件之后 增加map屬性之后&#xff0c;地圖上會出現自帶的marker點&#xff0c; 這時通過 searchNearBy()成員方法獲取到的地點值含有省市區等詳細信息 但是將map屬性注釋掉之后 發現不返回省市區&#xff0c;但是又不想關聯上展示mar…

動靜態庫

說明&#xff1a;使用動靜態庫&#xff0c;一般直接安裝即可&#xff0c;其他使用方法了解即可 靜態庫 靜態庫&#xff08;Static Library&#xff09;是一種將代碼和數據打包成一個單獨的文件的庫文件&#xff0c;主要用于編譯時的鏈接&#xff0c;而不是運行時。靜態庫通常…

Android Studio 所有歷史版本下載

一、官網鏈接 https://developer.android.google.cn/studio/archive 操作 二、AndroidDevTools地址 https://www.androiddevtools.cn/ 參考 https://blog.csdn.net/qq_27623455/article/details/103008937

Mybatis源碼剖析---第二講

Mybatis源碼剖析—第二講 那我們在講完了mappedstatement這個類&#xff0c;它的一個核心作用之后呢&#xff1f;那下面我有一個問題想問問各位。作為mappedstatement來講&#xff0c;它封裝的是一個select標簽或者insert標簽。但是呢&#xff0c;我們需要大家注意的是什么&am…