1. 程式人生 > >c++11多執行緒 生產者-消費者模型/條件變數condition_variable

c++11多執行緒 生產者-消費者模型/條件變數condition_variable

1.生產者消費者模型:

在工作中,大家可能會碰到這樣一種情況:某個模組負責產生資料,這些資料由另一個模組來負責處理(此處的模組是廣義的,可以是類、函式、執行緒、程序等)。產生資料的

模組,就形象地稱為生產者;而處理資料的模組,就稱為消費者。在生產者與消費者之間在加個緩衝區,我們形象的稱之為倉庫,生產者負責往倉庫了進商品,而消費者負責從

倉庫裡拿商品,這就構成了生產者消費者模式。結構圖如下:

2 c++11條件變數:

std::condition_variable 是為了解決死鎖而生的。當互斥操作不夠用而引入的。比如,執行緒可能需要等待某個條件為真才能繼續執行,而一個忙等待迴圈中可能會導致所有其他執行緒都無法進入臨界區使得條件為真時,就會發生死鎖。所以,condition_variable

例項被創建出現主要就是用於喚醒等待執行緒從而避免死鎖。std::condition_variable的 notify_one()用於喚醒一個執行緒;notify_all() 則是通知所有執行緒。

下例中我們通過佇列來模擬緩衝區實現生產者消費者模型:

#include<condition_variable>
#include<mutex>
#include<thread>
#include<iostream>
#include<queue>
#include<chrono>

int main(){
	std::queue<int>products;          //產品佇列

	std::mutex m;
	std::condition_variable cond_var; //條件變數
	bool notifid = false;             //通知標誌
	bool done = false;                //消費者程序結束標誌

	std::thread producter( [&](){     //捕獲互斥鎖

		for(int i=1; i<10; ++i){
			std::this_thread::sleep_for(std::chrono::seconds(1)); //等待1S

			std::unique_lock<std::mutex>lock(m);        //建立互斥量 保證下列操作不被打斷
			std::cout<<"producting "<<i<<std::endl;
			products.push(i);
			notifid = true;                             
			cond_var.notify_one();						//通知另一執行緒
		}
		done = true;                      //生產結束
		cond_var.notify_one();
	});


	std::thread consumer( [&](){
		while(!done){
			std::unique_lock<std::mutex>lock(m);
			while(!notifid){
				cond_var.wait(lock);             //通過呼叫 互斥量 來等待 條件變數
			}
			while(!products.empty()){
				std::cout<<"consumer "<<products.front()<<std::endl;
				products.pop();
			}
			notifid = false;
		}
	});
	producter.join();
	consumer.join();
	return 0;
}


相關推薦

c++11執行 生產者-消費者模型/條件變數condition_variable

1.生產者消費者模型: 在工作中,大家可能會碰到這樣一種情況:某個模組負責產生資料,這些資料由另一個模組來負責處理(此處的模組是廣義的,可以是類、函式、執行緒、程序等)。產生資料的 模組,就形象地稱為生產者;而處理資料的模組,就稱為消費者。在生產者與消費者之間在加個緩衝區

Java執行——生產者消費者模型-演義

這裡主要解讀(亂侃)生產者消費者模型的工作方式以及JDK5.0新增實現和傳統同步關鍵字實現方式的區別。 在JDK5.0新增了Lock、Condition這兩個介面來處理多執行緒安全問題。 Lock:可替代synchronized實現的同步函式或同步程式碼塊。 Conditi

[執行] 生產者消費者模型的BOOST實現

說明 如果 使用過程中有BUG 一定要告訴我:在下面留言或者給我郵件(sawpara at 126 dot com) 使用boost::thread庫來實現生產者消費者模型中的緩衝區! 倉庫內最多可以存放 capacity 個產品。 條件變數 condi

基於單鏈表、環形佇列(併發有鎖)的執行生產者消費者模型

基於單鏈表 基於環形佇列 1、環形緩衝區 緩衝區的好處,就是空間換時間和協調快慢執行緒。緩衝區可以用很多設計法,這裡說一下環形緩衝區的幾種設計方案,可以看成是幾種環形緩衝區的模式。設計環形緩衝區涉及到幾個點,一是超出緩衝區大小的的索引如何處理,

Linux C語言執行庫Pthread中條件變數的的正確用法逐步詳解

(本文的讀者定位是瞭解Pthread常用多執行緒API和Pthread互斥鎖,但是對條件變數完全不知道或者不完全瞭解的人群。如果您對這些都沒什麼概念,可能需要先了解一些基礎知識) Pthread庫的條件變數機制的主要API有三個: int pthread_cond_w

C++11 併發指南九(綜合運用: C++11 執行生產者消費者模型詳解)

前面八章介紹了 C++11 併發程式設計的基礎(抱歉哈,第五章-第八章還在草稿中),本文將綜合運用 C++11 中的新的基礎設施(主要是多執行緒、鎖、條件變數)來闡述一個經典問題——生產者消費者模型,並給出完整的解決方案。 生產者消費者問題是多執行緒併發中一個非常經典的問題,相信學過作業系統課程的同學都清楚

C++11 執行生產者消費者模型詳解

 前面八章介紹了 C++11 併發程式設計的基礎(抱歉哈,第五章-第八章還在草稿中),本文將綜合運用 C++11 中的新的基礎設施(主要是多執行緒、鎖、條件變數)來闡述一個經典問題——生產者消費者模型,並給出完整的解決方案。 生產者消費者問題是多執行緒併發中一個非常

用BlockBoundQueue和c++11實現執行生產者消費者問題

最近在讀到陳碩的《linux多執行緒服務端程式設計》這書時,發現了兩個特別好用的模板類 : BlockQueue和BlockBoundQueue,用來實現多執行緒中的生產者消費者問題是特別方便的。但是其原始碼中用到boost庫,所以在這裡我稍微修改下,實現如下。

c++11執行中的condition_variable生產者消費者示例)

#include <iostream> #include <string> #include <th

[轉]c++11 執行 future/promise

[轉自 https://blog.csdn.net/jiange_zh/article/details/51602938] 1. < future >標頭檔案簡介 Classes std::future std::future_error std::packaged_task std::pro

c++11執行 thread

 1.thread建構函式 default (1) thread() noexcept; initialization (2) template <class Fn, class... Args> explicit

執行--生產者消費者範例,使用lock和condition

        上一篇的部落格已經介紹了生產者和消費者,最後還是遺留了一個問題,就是必須Notifyall才能保證喚醒對方執行緒,這樣降低了效率,那麼,有沒有什麼辦法可以指定我們來喚醒哪一個執行緒呢?   &

C++11 執行執行共享資料

共享資料的問題 這些在作業系統中都有詳細的介紹,可以回顧作業系統課程。。很典型的就是資料競爭問題。 互斥量保護資料 最原始的方式:使用std::mutex建立互斥量,使用成員lock()加鎖,使用成員unlock()解鎖。但是這種方式需要我們在每個函數出口都呼叫一次unloc

c++11執行執行

最近需要開發一個高效能運算庫,涉及到c++多執行緒的應用,上次做類似的事情已經是4年多以前了,印象中還頗有些麻煩。悔當初做了就算了,也沒想著留點記錄什麼的。這次又研究了一番,發現用上c++11特性之後,現在已經比較簡單了,在此記錄一下。   最簡單的多執行緒情況,不涉及公共變數,各個執行緒之間獨

C++11執行(1)

        C++11中添加了duox多執行緒類,編寫C++程式可以直接使用C++11中的多執行緒庫,不必依賴於平臺多執行緒,這樣可以方便寫出誇平臺的多執行緒程式。多執行緒可以最大化利用計算機資源,提高程式碼的執行效率。         C++11中thread類提供兩

Java執行-生產者消費者模式

問題描述 有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序將它所產生的產品放入緩衝區中,消費者程序可以從一個緩衝區中取走產品去消費。儘管所有的生產者和消費

C++ 11 執行下std::unique_lock與std::lock_guard的區別和用法

這裡主要介紹std::unique_lock與std::lock_guard的區別用法 先說簡單的 一、std::lock_guard的用法 std::lock_guard其實就是簡單的RAII封裝,在建構函式中進行加鎖,解構函式中進行解鎖,這樣可以保證函式退出時,鎖一定被釋放。 簡單來說,就是防止開

C++11執行------std::async

std::async可以認為是封裝了一個std::promise,該函式返回一個std::future,用於獲取其他執行緒的資料。 一般有兩種模式: std::lanch::async:最常用的非同步模式,每次都要執行一遍 std::lanch::defer:只在第

C++11執行---互斥量、鎖、條件變數的總結

關於互斥量std::mutex的總結 互斥量用於組成程式碼的臨界區。C++的多執行緒模型是基於記憶體的,或者說是基於程式碼片段的,這和我們作業系統學習的臨界區概念基本一致,但是與Golang不同,Golang是基於訊息模型的。 一個std::mutex的lock()和unlock

C++11執行的原子操作

原子操作是同時只能有一個執行緒執行一個操作,不用使用互斥量即可實現,但是速度慢,而且一般只支援原生的型別,不夠靈活。更多的用處是作為訊號量進行使用。 示例程式碼,以int為例子: #include <atomic> #include <thread> #i