1. 程式人生 > >C++學習 boost學習之-生產者消費者問題例子

C++學習 boost學習之-生產者消費者問題例子

#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <iostream>
#include <vector>

class bounded_buffer : private boost::noncopyable
{
public:
    typedef boost::mutex::scoped_lock lock;
    bounded_buffer(int n) : begin(0), end(0), buffered(0), circular_buf(n) { }
    void send (int m) {
        lock lk(monitor);
        while (buffered == circular_buf.size())
            buffer_not_full.wait(lk);
        circular_buf[end] = m;
        end = (end+1) % circular_buf.size();
        ++buffered;
        buffer_not_empty.notify_one();
    }
    int receive() {
        lock lk(monitor);
        while (buffered == 0)
            buffer_not_empty.wait(lk);
        int i = circular_buf[begin];
        begin = (begin+1) % circular_buf.size();
        --buffered;
        buffer_not_full.notify_one();
        return i;
    }
private:
    int begin, end, buffered;
    std::vector<int> circular_buf;
    boost::condition buffer_not_full, buffer_not_empty;
    boost::mutex monitor;
};
bounded_buffer buf(2);

void sender() {
    int n = 0;
    while (n < 100) {
        buf.send(n);
        std::cout << "sent: " << n << std::endl;
        ++n;
    }
    buf.send(-1);
}

void receiver() {
    int n;
    do {
        n = buf.receive();
        std::cout << "received: " << n << std::endl;
    } while (n != -1); // -1 indicates end of buffer
}

int main()
{
    boost::thread thrd1(&sender);
    boost::thread thrd2(&receiver);
    thrd1.join();
    thrd2.join();
}

讀例子是很好的學習方式!

相關推薦

C++學習 boost學習-生產者消費者問題例子

#include <boost/thread/condition.hpp> #include <boost/thread/mutex.hpp> #include <boost/thread/thread.hpp> #include <iostream> #inc

C++學習 boost學習-noncopyable【轉】

(轉自:https://blog.csdn.net/skdkjzz/article/details/45888727) 用法: 1 私有派生於noncopyable的類都不能複製和賦值 2 原理是:noncopyable內部禁止了賦值和複製 3 該類可以被很好被複用,減少工作量,不用

C++學習 boost學習-function

要點: 1 用於儲存函式物件,本身是函式物件 2 與bind一起使用,威力巨大: class command { boost::function<void()> f_; public: command() {} command(boost::fun

Boost, C++11,生產者消費者以及Qt生產者消費者例子

先看個Qt的生產者消費者 #include <QtCore> #include <iostream> const int DataSize = 100000; con

java並發生產者消費者模型

isf tof on() acc sum sca span empty poll 生產者和消費者模型是操作系統中經典的同步問題。該問題最早由Dijkstra提出,用以

線程通信生產者消費者模型

釋放 另一個 gpo 停止 product @override getname -s rup   線程通信,是指線程之間的消息傳遞。   多個線程在操作同一個資源時,它們對共享資源的操作動作可能不同;它們共享同一個資源,互為條件,相互依賴,相互通信,從而讓任務向前推進。  

golang 並發編程生產者消費者

單元 and func 之間 -m 內部實現 根據 inux ati golang 最吸引人的地方可能就是並發了,無論代碼的編寫上,還是性能上面,golang 都有絕對的優勢 學習一個語言的並發特性,我喜歡實現一個生產者消費者模型,這個模型非常經典,適用於很多的並發場景,下

Hadoop生態圈-Kafka的API生產者-消費者

HA size ron 作品 消費 消費者 hadoop ado 原創                     Hadoop生態圈-Kafka的API之生產者-消費者                                             作者:尹正傑 版權

c++實現多對多生產者消費者和socket連用

背景:服務端實現一個多對多的生產者消費者模式,監聽某個埠,一旦有client連入,將socket存入佇列。通知消費者程序進行消費。在消費者程序中,拿到客戶端的socket,接收客戶端的資訊,並將接收到的資料返回服務端。 難點:鎖,server main函式如何生成多對多的執行緒(這是個大坑,放的

多執行緒初探生產者消費者

前言 對於java開者而言,多執行緒開發是不可避免的,多執行緒程式相對於單執行緒程式穩定性更強,一個執行緒掛了不會影響整個程式的正常執行。在多cup的機器上,多執行緒更加具有效率上的優勢。但是多執行緒也會導致一些問題,集中出現在資料方面。當多個執行緒操作同一個資料來源的時候就會出現讀

Java多執行緒生產者消費者問題:使用synchronized 關鍵字解決生產者消費者問題

        今天看了一片博文,講Java多執行緒之執行緒的協作,其中作者用程式例項說明了生產者和消費者問題,但我及其他讀者發現程式多跑幾次還是會出現死鎖,百度搜了下大都數的例子也都存在bug,經過仔細研究發現其中的問題,並解決了,感覺有意義貼出來分享下。        

Java多執行緒生產者消費者問題:使用重入鎖、條件變數優雅地解決生產者消費者問題

        Java5中新增了大量執行緒同步的功能,比如顯式Lock,讀寫鎖ReadWriteLock,條件變數Condition等,雖然這些功能使用之前的synchronized同步關鍵字都可能實現,但自己使用同步關鍵字不僅管理混亂,而且容易出錯。 如下是使用顯式Lo

Java多執行緒-生產者消費者例子-使用阻塞佇列(BlockingQueue)實現

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * Created by wisgood . */ public

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

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

併發設計模式生產者-消費者模式

生產者-消費者模式是一個經典的多執行緒設計模式,它為多執行緒間的協作提供了良好的解決方案。在生產者-消費者模式中,通常有兩類執行緒,即若干個生產者和若干個消費者執行緒。生產者執行緒負責提交使用者請求,消費者執行緒則負責處理生產者提交的任務。生產者和消費者之間通過共享記憶

java多執行緒生產者消費者經典問題

看過 http://blog.csdn.net/thinkpadshi/article/details/8163751     下面的評論說:    感覺你的程式碼有問題啊,兩個run()方法裡面的列印語句的執行先後問題,假設開始在消費時index==0;這時wait()了

多執行緒生產者/消費者模式(值操作)

1、一個生產者,一個消費者(值操作) 本小節是典型的單個生產者,單個消費者,生產物件為值的Demo 如下,我們假設ValueObject .value為生產的值,當value的值為 “”(空串)時,我們認為生產出來的物件已被消費,當value的值不為空串時,

多執行緒生產者消費者

/* * 以生產饅頭,消耗饅頭為例 */ public class ProduceConsume { public static void main(String[] args) { SyncStack ss = new SyncS

java多執行緒生產者消費者佇列

package com.eshroe.sweetop.concurrency; import java.util.Random; import java.util.concurrent.Executor

java 多執行緒併發系列 生產者消費者模式的兩種實現

生產者消費者模式是併發、多執行緒程式設計中經典的設計模式,生產者和消費者通過分離的執行工作解耦,簡化了開發模式,生產者和消費者可以以不同的速度生產和消費資料。真實世界中的生產者消費者模式生產者和消費者模式在生活當中隨處可見,它描述的是協調與協作的關係。比如一個人正在準備食物(