[c++]代码库
// 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();
}
初级程序员
by: 是一只小龙呀 发表于:2021-11-11 19:41:54 顶(0) | 踩(0) 回复
1
回复评论