您的位置:首页 > 其它

boost学习之-生产者消费者问题例子

2012-07-21 23:36 295 查看
生产者消费者问题在线程编程中是基础问题,很重要,很多其他问题的解决都通过扩展该问题的解决方法来解决的;

boost中的一个例子是这样写的,很简洁;所以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();

}

读例子是很好的学习方式!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐