欢迎来到天天文库
浏览记录
ID:38700821
大小:55.00 KB
页数:13页
时间:2019-06-17
《生产者消费者设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
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
此文档下载收益归作者所有