生产者消费者问题C++实现

2020/10/11 11:23

问题

设计C/C++程序(可以嵌入汇编语言),以忙等待方式实现信号量及其P、V操作。利用你实现的信号量,实现生产者-消费者问题。给出实现方法、主要源代码和测试结果。

代码

# include<iostream>
# include<thread>
# include<vector>
# include<mutex>
# include<condition_variable>
# include<queue>
#include <ctime>
#include <windows.h>
using namespace std;# define PRODUCT_SIZE 5//生产者数量
# define CUSTOMER_SIZE 20//消费者数量
#define MAX_SIZE 10//最大产品数量
mutex mut;//互斥锁
condition_variable con;//条件变量
queue<int> que;//队列,模拟缓冲区
void Producter()
{while (true){Sleep(10);srand(int (time(NULL)));std::unique_lock <std::mutex> lck(mut);/*当 std::condition_variable对象的某个wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用*/while (que.size() > MAX_SIZE)//当队列已满时等待,不再生产{con.wait(lck);//P操作}int data = rand();//随机产生数字代表商品的生产que.push(data);//将数据推入队列代表商品加入缓冲区cout << this_thread::get_id() << "生产了产品:" << data << endl;Sleep(500);con.notify_all();//唤醒所有等待的进程,即V操作}
}
void Customer()
{while (true){std::unique_lock <std::mutex> lck(mut);while (que.empty())//当队列为空时等待,不再消费{//用condition_variable对象实现对缓冲区的互斥操作con.wait(lck);//P操作}cout << this_thread::get_id() << "消费了产品:" << que.front() << endl;Sleep(500);que.pop();con.notify_all();//唤醒所有等待的进程,即V操作}
}
int main()
{vector<thread> threadPoll;//创建生产者和消费者for (int i = 0; i < PRODUCT_SIZE; ++i){threadPoll.push_back(thread(Producter));}for (int i = 0; i < PRODUCT_SIZE + CUSTOMER_SIZE; ++i){threadPoll.push_back(thread(Customer));}for (int i = 0; i < PRODUCT_SIZE + CUSTOMER_SIZE; ++i){threadPoll[i].join();//原始线程等到新线程执行完毕后再销毁}return 0;
}

运行截图

1.利用条件变量condition_variable实现PV操作,当condition_variable对象的某个wait 函数被调用的时候,它使用 unique_lock(通过 mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的condition_variable 对象上调用
2.用产生的随机数字代表商品的生产,加入队列表示加入缓冲区
3.线程销毁采用join方式,等待新线程执行完毕再销毁原始线程

生产者消费者问题C++实现相关推荐

  1. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  2. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  3. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  4. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  5. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  6. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  7. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  8. java线程模拟生产者消费者问题

    所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...

  9. 图文并茂的生产者消费者应用实例demo

    前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...

  10. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

最新文章

  1. 【转】从底层了解ASP.Net体系结构
  2. java编写十个评委_Java题 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分...
  3. 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
  4. 树 森林 二叉树 遍历
  5. 无限级菜单 mysql设计_无限级菜单简单的设计
  6. EF延迟加载LazyLoading
  7. [网络流24题]太空飞行计划
  8. Web内核微信小程序框架实践
  9. 计算机2级什么时间考,全国计算机2级考试什么时间出成绩单
  10. Linux引出环境变量的关键字,学习记录008-linux常用命令/设置系统and用户环境变量two(示例代码)...
  11. MATLAB获取系统时间
  12. linux 环境变量和shell变量
  13. linux mail 使用外部邮箱地址发邮件
  14. 3. wordpress 固定链接
  15. 文献检索报告 计算机网络管理技术 中农大,文献检索论文--计算机网络管理技术《文献检索》报告.doc...
  16. 【Scratch】进阶篇-《Scratch游戏开发》FlappyTurtle
  17. 数据挖掘 文本分类(二)搜集中文语料库与ICTCLAS分词
  18. The root link base_link has an inertia specified in the URDF, but KDL does not support a root ...
  19. HTML+CSS基础学习笔记1
  20. 专访|搜狐媒体UED设计总监李伟巍:如何做好UED设计

热门文章

  1. Flask教程(五)GET和POST
  2. .php怎么转化为jpg,php如何将png转换成jpg
  3. 常规店铺 买家卖家业务 数据库设计源码
  4. OWASP top 10漏洞原理及防御(2017版官方)
  5. 华为应急通讯完美版 GSMS软件 ISO文件 百度网盘下载
  6. 解决GiHub下载太慢的问题
  7. 怎么更新现有全国谷歌卫星地图高清影像数据到最新版?
  8. 影音之星:一款纯绿色的万能影音播放器
  9. App免填邀请码的解决方案
  10. 长沙哪个职高学计算机好,湖南职业学校排名前十,长沙职高学校排名?