bounded_buffer.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 70 行

CPP
70
字号
// Copyright (C) 2001-2003// William E. Kempf////  Distributed under the Boost Software License, Version 1.0. (See accompanying //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#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();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?