参考上一篇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. Git设置文件或目录忽略跟踪的三种方式

    1. 共享的忽略设置方式 本地仓库根目录,创建.gitignore文件,并编辑正则匹配需要忽略的文件或目录. .gitignore文件需要上传到仓库,同时会影响到他人,共享忽略设置 注意: .giti ...

  2. fedora23没有/var/log/messages &如何禁用后台自动更新软件?

    警告!! Linux是一个非常敏感的操作系统,若删除文件错误,很容易造成系统崩溃. fedora23没有/var/log/messages 不是没有messages这个文件,而是 从 fc core ...

  3. WEB API 系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  4. 【搬运工】mysql用户权限设置

    关于mysql的用户管理,笔记 1.创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localhost id ...

  5. 常看本地是否安装Git和maven工具

    打开cmd命令行工具: 查看git where git C:\Users\jasqia>where gitC:\Program Files\Git\cmd\git.exe 安装maven后需要到 ...

  6. (2)OSi模型

    osi七层模型 #(应用层,表示层,会话层) => 应用层 => 表达一个数据信息 # 传输层 port(端口) tcp/udp协议 硬件设备:四层交换机 四层路由器 # 网络层 ip协议 ...

  7. Redis缓存之自定义CacheManager

    测试缓存:原理:CacheManager===Cache 缓存组件来实际给缓存中存储数据1,引入redis的starter,容器中保存的是RedisCacheManager2,RedisCacheMa ...

  8. 学习web components

    javascript里的两种组件 1 autonomous custom elements 一般extends HTMLElement, 可以通过<popup-info>或doducmen ...

  9. 浅谈Pool对象

    Pool对象的技术指标: 避免频繁创建经常使用的稀有资源,提高工作效率. 控制阀值,很多情况下一些关键资源都有一个最佳并发数,超过这个拐点性能有可能急剧下降,也有可能继续增大并发数性能不能提升. 安全 ...

  10. Linux删除/boot后该如何恢复

    一.其实不光boot目录被删除,也有系统启动不起来等,一直因为/boot这个目录的的问题,今天就来解决一下 Centos 6 1.进入救援,先修复vmlinz(内核) chroot /mnt/sysi ...