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 ...
随机推荐
- Python下关于RSA解密模块的使用
最近筹备一场CTF比赛发现了一道关于RSA解密的题如下: #小明得到了一个 RSA 加密信息,你能帮他解开吗? n = 4106906565495961459775020773869808579876 ...
- Python游戏编程入门3
用户输入:Bomb Catcher游戏本章介绍使用键盘和鼠标获得用户输入.包括如下主题:学习pygame事件学习实时循环学习键盘和鼠标事件学习轮询键盘和鼠标的状态编写Bomb Catcher游戏 1本 ...
- c# mongodb drive IngoreExtraElements and RegisterClassMap
private static void RegisterClassMaps(IEnumerable<Type> clrTypes) { foreach (var clrType in cl ...
- 11_vim
vim编辑器 文本编辑器,字处理器linux重要哲学思想之一:使用纯文本格式来保存软件的配置信息,大多数情况下都是如此,而且一切皆文件此前学过nano,sed..nano入门简单,但功能简陋 vi:V ...
- python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其 ...
- 区间DP 基本题集
51 Nod 1021 石子归并 模板题,敲就完事了,注意一下这种状态转移方程有个四边形的优化(时间) #include <cstdio> #include <iostream> ...
- 删除链表的倒数第N个节点(java实现)
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...
- [pycharm]远程调试服务器项目
Pycharm远程调试服务器项目 准备工作 创建一个临时项目,用pycharm打开项目 mkdir xxx 准备一台远程服务器,尝试连接服务器 ssh worker@ip 同步项目到pycharm 配 ...
- 配置Spring MVC - 2019
未完 软件环境:Eclipse-EE 1. 创建Maven Project 2. pom.xml - [更新日期19/03/31] <dependencies> <dependenc ...
- WebAPI调用笔记
前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于Http协议的Get.Po ...