生产者消费者设计模式

生产者消费者设计模式

ID:38700821

大小:55.00 KB

页数:13页

时间:2019-06-17

生产者消费者设计模式_第1页
生产者消费者设计模式_第2页
生产者消费者设计模式_第3页
生产者消费者设计模式_第4页
生产者消费者设计模式_第5页
资源描述:

《生产者消费者设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、基于C++11实现生产者消费者设计模式本文将综合运用C++11中的新的基础设施(主要是多线程、锁、条件变量)来阐述一个经典问题——生产者消费者模式,并给出完整的解决方案。生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源。本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模式,单生产者-多消费者模式,多生产者-单消费者模式,多生产者-多消费者模式,我会给出四种情况下的C++11并发解决方案,如果文中出现了错误或者你对代码有异议,欢迎交流。1单生产者-

2、单消费者模式顾名思义,单生产者-单消费者模式中只有一个生产者和一个消费者,生产者不停地往产品库中放入产品,消费者则从产品库中取走产品,产品库容积有限制,只能容纳一定数目的产品,如果生产者生产产品的速度过快,则需要等待消费者取走产品之后,产品库不为空才能继续往产品库中放置新的产品,相反,如果消费者取走产品的速度过快,则可能面临产品库中没有产品可使用的情况,此时需要等待生产者放入一个产品后,消费者才能继续工作。C++11实现单生产者单消费者模式的代码如下:#include#include

3、#include#include#include#includestaticconstintkItemRepositorySize=10;//Itembuffersize.staticconstintkItemsToProduce=1000;//Howmanyitemsweplantoproduce.structItemRepository{intitem_buffer[kItemRepositorySize];//产品缓冲区,配合

4、read_position和write_position模式环形队列.size_tread_position;//消费者读取产品位置.size_twrite_position;//生产者写入产品位置.std::mutexmtx;//互斥量,保护产品缓冲区std::condition_variablerepo_not_full;//条件变量,指示产品缓冲区不为满.std::condition_variablerepo_not_empty;//条件变量,指示产品缓冲区不为空.}gItemRepository;//产品库全局变

5、量,生产者和消费者操作该变量.typedefstructItemRepositoryItemRepository;voidProduceItem(ItemRepository*ir,intitem){std::unique_locklock(ir->mtx);while(((ir->write_position+1)%kItemRepositorySize)==ir->read_position){//itembufferisfull,justwaithere.std::cout<<"Produc

6、eriswaitingforanemptyslot...";(ir->repo_not_full).wait(lock);//生产者等待"产品库缓冲区不为满"这一条件发生.}(ir->item_buffer)[ir->write_position]=item;//写入产品.(ir->write_position)++;//写入位置后移.if(ir->write_position==kItemRepositorySize)//写入位置若是在队列最后则重新设置为初始位置.ir->write_position=0;(ir-

7、>repo_not_empty).notify_all();//通知消费者产品库不为空.lock.unlock();//解锁.}intConsumeItem(ItemRepository*ir){intdata;std::unique_locklock(ir->mtx);//itembufferisempty,justwaithere.while(ir->write_position==ir->read_position){std::cout<<"Consumeriswaitingforitems

8、...";(ir->repo_not_empty).wait(lock);//消费者等待"产品库缓冲区不为空"这一条件发生.}data=(ir->item_buffer)[ir->read_position];//读取某一产品(ir->read_position)++;//读取位置后移if(ir->read_po

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。