C++11实现生产者消费者问题
生产者消费者问题是多线程并发中一个非常经典的问题。我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考。
#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <mutex>
#include <thread>
#include <condition_variable>
const int bufferSize=;
struct ItemRepository
{
int item_buffer[bufferSize];
int write_pos; //current position of producer
int read_pos; //current position of consumer
std::condition_variable not_empty_con;
std::condition_variable not_full_con;
std::mutex mtx;
}itemRepository; void produce_one_item(ItemRepository*ir)
{
if (!ir)
return;
int* item_buffer = ir->item_buffer;
std::unique_lock<std::mutex> lock(ir->mtx);
if (ir->write_pos == ir->read_pos&&
item_buffer[ir->write_pos] == )//the repository is full
{
std::cout << "The producer is waiting for an empty." << std::endl;
ir->not_full_con.wait(lock);
} item_buffer[ir->write_pos] = ;//now the buffer in this position is full
std::cout << "The producer produces a new item on " << ir->write_pos << std::endl;
ir->write_pos++;
ir->not_empty_con.notify_all();//notify the consumer to consume items if (ir->write_pos == bufferSize)
ir->write_pos = ;
} void consume_one_item(ItemRepository*ir)
{
if (!ir)
return;
int* item_buffer = ir->item_buffer;
std::unique_lock<std::mutex> lock(ir->mtx); if (ir->read_pos == ir->write_pos&&
item_buffer[ir->write_pos] == )//the repository is empty
{
std::cout << "The consumer is waiting for items." << std::endl;
ir->not_empty_con.wait(lock);
} item_buffer[ir->read_pos] = ;//now the buffer in this position is empty
std::cout << "The consumer consumes an item on " << ir->read_pos << std::endl;
ir->read_pos++;
ir->not_full_con.notify_all();//notify the producer to produce new items if (ir->read_pos == bufferSize)
ir->read_pos = ;
} void produceTask()
{
for (int i = ; i < ; i++)
produce_one_item(&itemRepository);
} void consumeTask()
{
for (int i = ; i < ; i++)
{
Sleep();
consume_one_item(&itemRepository);
}
} void initializeRepository(ItemRepository*ir)
{
if (!ir)
return;
ir->read_pos = ;
ir->write_pos = ;
} int main()
{
initializeRepository(&itemRepository);
std::thread producer(produceTask);
std::thread consumer(consumeTask);
producer.join();
consumer.join();
system("pause");
return ;
}
注意我判断item_buffer中的物品是否全空或者全满的条件:生产者和消费者的位置相等时,若该位置上为空则buffer全空,若为满则buffer全满。
C++11实现生产者消费者问题的更多相关文章
- C++11 实现生产者消费者双缓冲
基础的生产者消费者模型,生产者向公共缓存区写入数据,消费者从公共缓存区读取数据进行处理,两个线程访问公共资源,加锁实现数据的一致性. 通过加锁来实现 class Produce_1 { public: ...
- C++11 实现生产者消费者模式
代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...
- C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)
前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...
- 综合运用: C++11 多线程下生产者消费者模型详解(转)
生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源.本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模型,单生产者-多消费者模 ...
- 再谈多线程模型之生产者消费者(总结)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
- 再谈多线程模型之生产者消费者(多生产者和多消费者 )(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
- 再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
- 再谈多线程模型之生产者消费者(单一生产者和多消费者 )(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
- 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...
随机推荐
- discuz ucenter无法连接数据库
discuz ucenter无法连接数据库 - discuz搬家后 ucenter无法连接数据库 论坛换了个空间,把密码和数据库名称都改了,点击ucenter时候出现了: UCenter info: ...
- [WPF]GridView或DataGrid中自定义样式:依据某一列设定其对应行的样式(背景色,字体等)
附效果照一张: 本方法使用StyleSelector来 获得依据自定义逻辑的style. ① class ConditionalStyleSelector : StyleSelector { publ ...
- vs下 qt源码调试
1.下载qt源码,我下载的是4.7.1版本 2.vs安装qt插件qt-add-in 3.进入qt根目录,打开configure文件,找到 QT_DEFAULT_BUILD_PARTS="li ...
- JSTL的fn函数
JSTL使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及session中的数据的访问非常方便,但是我们在实际应用中经常需要在 ...
- ABAP 生产订单的创建与修改函数
ABAP 生产订单的创建与修改函数转自http://www.cnblogs.com/aBaoRong/archive/2012/04/11/2441946.html 如果生产订单过多,可以批量创建 ...
- Eclipse+Tomcat搭建https环境
一.首先在本地建立一个keystore文件 用命令:keytool -v -genkey -alias tomcat -keyalg RSA -keystore c:/tomcat.keystore ...
- jQuery中方法html()与text()的不同
区别一:html()方法设置或者返回被选元素的内容,其效果类似于操作元素对象的“innerHTML”属性:text()方法设置或者返回被选元素的文本内容,其效果等同于操作元素对象的“textConte ...
- c# 映射对比测试
c# 映射对比测试(测试对象,测试案例,测试结果) 测试组件对象: TinyMapper-EmitMapper-AutoMapper-NLiteMapper-Handwritten 对比测试案例: ...
- HTML 图像显示
HTML 图像显示:图像标签:<img>,源属性:Src<img>是空标签,没有闭合标签,它只包含属性:显示图像时需要调用源属性src:src的值是图像的地址:语法:<i ...
- c# List的排序
list 是我们常用到的数据类型,我们常常会用list去处理很多的数据.我们也常常会有这样的一个操作,就是排序sort list 所在的命名空间是System.Collections.Generic ...