参考上一篇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-->单生产者,单消费者问题的更多相关文章

  1. disruptor 单生产者多消费者

    demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> < ...

  2. Android(java)学习笔记11:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...

  3. RabbitMQ入门学习系列(二),单生产者消费者

    友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...

  4. C++11实现生产者消费者问题

    生产者消费者问题是多线程并发中一个非常经典的问题.我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考. #include <windows.h> #include &l ...

  5. C++11 实现生产者消费者模式

    代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...

  6. Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结

    版权声明:原创作品,谢绝转载!否则将追究法律责任. Disruptor是一个优秀的并发框架,可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系.网上其他博客 ...

  7. 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)

    说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...

  8. 从零开始实现lmax-Disruptor队列(一)RingBuffer与单生产者、单消费者工作原理解析

    1.lmax-Disruptor队列介绍 disruptor是英国著名的金融交易所lmax旗下技术团队开发的一款java实现的高性能内存队列框架 其发明disruptor的主要目的是为了改进传统的内存 ...

  9. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  10. SpringMVC(11)表单标签

    本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...

随机推荐

  1. 爬虫中xpath的特殊用法

    Xpath之starts-with(@属性名称,属性字符串相同部分) 以相同的字符开头的用法 在做爬虫时解析html的源码时候可能会遇见以下这种标签, <div id="test-1& ...

  2. [java] 软工实践WordCount-Plus

    整体思路 模块化 对于任何一个小模块,例如:输入.输出.计算都独立开来,降低耦合. 插件化 对于任何一个模块均作成插件,可拔插,可更换,而不会导致其他的插件出现故障. 事件驱动 使用观察者模式,用事件 ...

  3. 优雅的使用Linux

    优雅的使用Linux 系统安装 启动盘制作 通过rufus烧制官网镜像,注意根据自己系统的引导模式选择相应模式,不确定的,可以在windows中通过Win + R 快捷键调出"运行" ...

  4. 【转载】RESTful 架构风格概述

    本文转载自https://blog.igevin.info/posts/restful-architecture-in-general/ 在移动互联网的大潮下,随着docker等技术的兴起,『微服务』 ...

  5. vue使用$http服务端收不到参数

    老夫子我正在憋方案书,听到身后传来细软的声音:“李哥,我这有个Bug调了很长时间了,您能帮我看一下吗?”.说这话的是我的好朋友,公司新来的前端小妹伊万卡.我起身向她走去,看到因长时间调试Bug漂亮的脸 ...

  6. 数据结构与算法(C#)入门 --- 序

    注:本系列文章适合新手入门.博主也是摸着石头过河,难免有错误之处.还请谅解~ ~~~ 数据结构是什么? 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 ...

  7. unittest用例执行的顺序

    unittest在执行用例(test_xxx)时,并不是按从上到下的顺序执行,有特定的顺序. 示例: import unittest class TestBdd(unittest.TestCase): ...

  8. Java中的各种bean对应的意义(VO,PO,BO,QO, DAO,POJO,DTO)

    VO(value object) 值对象 通常用于业务层之间的数据传递,用 new 关键字创建,由 GC 回收的,和 PO 一样也是仅仅包含数据而已.但应是抽象出的业务对象 , 可以和表对应 , 也可 ...

  9. C++ 基本数据类型,常量,变量

    基本数据类型 整数类型 基本的整数类型(int) 按符号分 符号的 (signed) 无符号的(unsigned) 按照数据范围分 短整数(short) 长整数(long) 长长整数(long lon ...

  10. react native 5.54 出ios版本遇到的坑(应该是在xcode10下才会有的吧)记录。。。。。。 据说5.7已经修复了

    1. config.h找不到 rm -r ~/.rncache/cd node_modules/react-native/third-party/glog-0.3.4/./configure --ho ...