C++11-->单生产者,单消费者问题
参考上一篇C++11并发编程
#include <iostream>
#include <queue>
#include <assert.h>
#include <condition_variable>
using namespace std; /***经典单消费者,单生产者问题***/ /***货物类,简单的以一个int数据表示货物***/
class Item
{
public:
Item(int i):data(i){} void display(){ cout << "Item: "<<data << endl;}
private:
int data;
}; /***仓库类***/
/***m_CurrentPos 表示当前货物位置,-1表示空仓库***/
/***m_SumSize 表示可以容纳的货物数量***/
/***m_House 用来存放货物(存放Item*)***/
class StoreHouse
{
public:
/***仓库容纳的货物数量***/
StoreHouse(int size):m_SumSize(size),m_CurrentPos(-1)
{
m_House = new Item *[size];
memset(m_House, 0, size * sizeof(Item *));
} ~StoreHouse()
{
delete[] m_House;
m_House = NULL;
} /***仓库是不是满了***/
bool isFull()
{
return m_CurrentPos == m_SumSize - 1;
} /***仓库是不是空的***/
bool isEmpty()
{
return m_CurrentPos == -1;
} /***朝仓库put进一个货物***/
void put(Item *item)
{
assert((m_CurrentPos +1) != m_SumSize);
++m_CurrentPos;
m_House[m_CurrentPos] = item;
} /***从仓库get出一个货物***/
Item * get()
{
assert(m_CurrentPos != -1);
Item *item = m_House[m_CurrentPos];
m_House[m_CurrentPos] = NULL;
--m_CurrentPos;
return item;
} private:
int m_SumSize;
int m_CurrentPos;
Item ** m_House;
}; StoreHouse gStoreHouse(4);/***仓库有4个货物空位***/
std::mutex mtx;
std::condition_variable cv_full; /***仓库满的cv***/
std::condition_variable cv_empty; /***仓库空的cv***/ int toProduceItem = 20;/***总共要生产的货物数量***/
int hasGet = 0; /***生产一个货物***/
Item* produceItem(int itemdata)
{
Item * item = new Item(itemdata);
return item;
} /***卖掉一个货物***/
void soldItem(Item *item)
{
assert(item != NULL); item->display();
delete item;
item = NULL;
} /***生产者task***/
void producerTask()
{
for (int i = 0; i < toProduceItem; i++)
{
std::unique_lock<std::mutex>lck(mtx);
while (gStoreHouse.isFull())/***如果仓库满,则通知当前生产者线程等待***/
{
cv_full.wait(lck);
} Item *item = produceItem(i);/***造个货***/ gStoreHouse.put(item);/***put一个货物进仓库后,现在仓库处于非空仓状态(有货物)***/ cv_empty.notify_one();/***通知某个等待cv_empty的thread,告诉他现在是非空仓状态了(仓库有货,可以来get货了)***/
} cout << "producerTask " << "id: " << " exit" << endl;
} /***消费者task***/
void consummerTask()
{
bool exited = false;
while (true)
{
if (hasGet == toProduceItem)
{
exited = true;
}
else
{
std::unique_lock<std::mutex>lck(mtx); while (gStoreHouse.isEmpty())/***如果仓库空,则通知当前消费者线程等待***/
{
cv_empty.wait(lck);
} Item *item = gStoreHouse.get();/***get一个货物出来,现在仓库不再满仓***/ ++hasGet; soldItem(item);/***卖掉货物***/ cv_full.notify_one();/***通知某个等待cv_full的thread,告诉他现在不是满仓状态了(仓库没满,可以造货put到仓库了)***/
} if (exited)
{
break;
}
} cout << "consummerTask "<<"id: "<<" exit" << endl;
} int main()
{
std::thread producer(producerTask);
std::thread consummer0(consummerTask); producer.join();
consummer0.join(); system("pause");
return 0;
}
C++11-->单生产者,单消费者问题的更多相关文章
- disruptor 单生产者多消费者
demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> < ...
- Android(java)学习笔记11:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
- RabbitMQ入门学习系列(二),单生产者消费者
友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...
- C++11实现生产者消费者问题
生产者消费者问题是多线程并发中一个非常经典的问题.我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考. #include <windows.h> #include &l ...
- C++11 实现生产者消费者模式
代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...
- Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结
版权声明:原创作品,谢绝转载!否则将追究法律责任. Disruptor是一个优秀的并发框架,可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系.网上其他博客 ...
- 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)
说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...
- 从零开始实现lmax-Disruptor队列(一)RingBuffer与单生产者、单消费者工作原理解析
1.lmax-Disruptor队列介绍 disruptor是英国著名的金融交易所lmax旗下技术团队开发的一款java实现的高性能内存队列框架 其发明disruptor的主要目的是为了改进传统的内存 ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...
- SpringMVC(11)表单标签
本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...
随机推荐
- 论文笔记:Prediction-Tracking-Segmentation
Prediction-Tracking-Segmentation 2019-04-09 18:47:30 Paper:https://arxiv.org/pdf/1904.03280.pdf 之所以要 ...
- vscode下运行matlab记录
Linux下安装MATLAB可参照以下链接: https://blog.csdn.net/qq_31285709/article/details/82083902 在vscode 中运行.m文件. 首 ...
- vue-router使用 看着篇就够了
官网地址:https://router.vuejs.org/zh/ 先来个自我介绍吧,我就是你们口中的路由,我的作用就是告诉你们怎么到达某地,比如你想去一个地方(前提是这个地方是已经存在的)我会查询我 ...
- formdata 上传图片+进度条
记得引入jquery //上传进度回调函数: function progressHandlingFunction(e) { if (e.lengthComput ...
- python-Word模板填充-docxtpl
docxtpl 按指定的word模板填充内容 安装 pip install docxtpl 示例 from docxtpl import DocxTemplate data_dic = { 't1': ...
- unity - ios打包真机测试及模拟器测试
本文介绍unity游戏如何在iphone机和ios模拟器上进行测试打包 准备工作:mac电脑一台.iphone一部.连接mac和iPhone的数据线.unity.Xcode.苹果开发者账号. 苹果开发 ...
- LInux 些许知识
1.Linux下去掉^M的方法 ①dos2unix filename ②sed -i 's/^M//g' filename #注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M 2.so ...
- java中的默认类型+spring
默认引用类型 Integer Character String(包装类)... private Integer age ; 默认是null 默认基本类型 int char string.privit ...
- C语言实验一(1)
#include<stdio.h>int main(){ int a,b,sum; a=123; b=456; sum=a+b; printf("sum is %d\n" ...
- iframe之间的postMessage传参
1.传参 function IframeClose() { var obj = {method: "iframeClose"}; window.parent.postMessage ...