生产者消费者问题是操作系统中典型的进程同步互斥问题,(英语:Producer-Consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。
该问题描述了两个共享固定大小缓冲区的线程“生产者”(Producer)和“消费者”(Consumer)在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。问题的约束条件是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中为空时消耗数据。下面的C++程序代码用水果的例子模拟生产者消费者模型,生产者随机生产水果列表{"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"}中的一种,缓冲区用数组模拟。程序应用了互斥锁和信号量,使用了CreateMutex,ReleaseMutex,CreateSemaphore,ReleaseSemaphore,WaitForSingleObject等Windows下的线程函数。C++代码如下:
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <string>
#include <time.h>using namespace std;const int limit = 30;  //生产总量
const int maxsize = 10; //缓冲区大小
const int kind = 7;
int bufIdx = 0;    //当前缓冲区下标string buf[maxsize];    //缓冲区 (字符串)//伪造的产品
string product[] = {"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"};HANDLE mutex,full,empty;HANDLE disp;    //用于控制屏幕打印的互斥锁//生产者子过程
DWORD WINAPI Producer(LPVOID param)
{int ct,idx;const int pwait = 100;srand(time(NULL)); //随机数播种WaitForSingleObject(disp, INFINITE);cout << "Producer Start!" << endl << endl;ReleaseMutex(disp);for (ct = 0; ct < limit; ct ++){idx = rand() % kind;WaitForSingleObject(disp, INFINITE);cout << product[idx] << " is ready!" << endl << endl;ReleaseMutex(disp);WaitForSingleObject(empty, INFINITE); //请求一个空缓冲区,阻塞WaitForSingleObject(mutex, INFINITE); //请求互斥锁,阻塞buf[bufIdx ++] = product[idx];WaitForSingleObject(disp, INFINITE);cout << product[idx] << " added to slot No. " << bufIdx << endl << endl;ReleaseMutex(disp);ReleaseMutex(mutex);    //释放互斥锁ReleaseSemaphore (full, 1, NULL);   //signal(full)Sleep(rand() % pwait + 100);  //休息一会}cout << "Producer Quit!" << endl << endl;return 0;
}//消费者子过程
DWORD WINAPI Consumer(LPVOID param)
{int ct;const int cwait = 300;string stuff;srand(time(NULL));WaitForSingleObject(disp, INFINITE);cout << "Consumer Start!" << endl << endl;ReleaseMutex(disp);for (ct = 0; ct < limit; ct ++){WaitForSingleObject(full, INFINITE); //请求一个满缓冲区,阻塞WaitForSingleObject(mutex, INFINITE); //请求互斥锁,阻塞stuff = buf[-- bufIdx];WaitForSingleObject(disp, INFINITE);cout << "Consumer get " << stuff << " from slot No. " << (bufIdx + 1) << endl << endl;ReleaseMutex(disp);ReleaseMutex(mutex);    //释放互斥锁ReleaseSemaphore (empty, 1, NULL);   //signal(empty)Sleep(rand() % cwait + 100);  //休息一会}cout << "Consumer Quit!" << endl << endl;return 0;
}int main()
{//生产者线程与消费者线程的线程IDDWORD ProducerID, ConsumerID;//线程句柄HANDLE ProducerHandle, ConsumerHandle;//创建生产者线程ProducerHandle = CreateThread(NULL, 0, Producer, NULL, 0, &ProducerID);//创建消费者线程ConsumerHandle = CreateThread(NULL, 0, Consumer, NULL, 0, &ConsumerID);disp = CreateMutex(NULL, FALSE, NULL);//创建互斥锁mutex = CreateMutex(NULL, FALSE, NULL);//创建缓冲区占用信号量full = CreateSemaphore (NULL, 0, maxsize, "full");//创建缓冲区空闲信号量empty = CreateSemaphore (NULL, maxsize, maxsize, "empty");//等待直到生产者线程执行完成if (ProducerHandle != NULL){WaitForSingleObject(ProducerHandle, INFINITE);CloseHandle(ProducerHandle);}//等待直到消费者线程执行完成if (ConsumerHandle != NULL){WaitForSingleObject(ConsumerHandle, INFINITE);CloseHandle(ConsumerHandle);}system("pause");
}

C++编程模拟生产者消费者模型相关推荐

  1. 并发编程——进程——生产者消费者模型

    一.生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务. 在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者 ...

  2. 模拟生产者消费者模型

    生产者消费者是多线程很经典的一个模型 牵涉三个对象:仓库.生产者.消费者 仓库代表共享变量 生产者表示在仓库生产货物 消费者表示从仓库拿出货物 实现思路:利用synchronized+wait()+n ...

  3. Linux实现生产者消费者模型

    生产者消费者模型 简单来说就是"321原则(并非某一规则,而是为了理解生产者消费者模型)" "3"代表的是三种关系 生产者与消费者的互斥与同步关系 生产者与生产 ...

  4. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  5. Python并发编程之多进程(生产者消费者模型)

    十二.生产者消费者模型 1.什么是生产者消费者模型 生产者 : 程序中负责产生数据的一方 消费者 : 程序中负责处理数据的一方 2.为什么引入生产者消费者模型 在并发编程中, 生产者消费者模式通过一个 ...

  6. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  7. Linux 多线程编程(实现生产者消费者模型)

    Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...

  8. Python并行编程(四):多线程同步之condition(条件变量)实现带有缓冲区的生产者-消费者模型...

    什么是Condtion? 所谓condition条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 这种同步机制就是一个线程等待特定的条件,另一个线程通知它条件已经发生.一旦条件发 ...

  9. 线程同步之 生产者消费者模型详解

    前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先 ...

最新文章

  1. 单摄像头+深度学习实现伪激光雷达,代码已开源
  2. 后端开发必知必学的 Linux 命令行大全
  3. 国内外免费PHP开源建站程序
  4. linux和android调试概要
  5. Tableau系列之构建和浏览数据视图
  6. android Listview scrollto 问题
  7. 新应用上线 Snippet
  8. 20145233《网络对抗》Exp6 信息收集和漏洞扫描
  9. c++ 写ftp服务器文件,C++实现的FTP服务器
  10. 美团点评 2019校园招聘 后台开发方向职位编程题-2018.09.06
  11. torch.masked_select()和Tensor.masked_scatter()的用法
  12. Windows 上安装 Bugzilla 详解
  13. 如何把PDF中一些页面拆分成每一页单独的文件
  14. html留言板原理,js实现留言板
  15. 混频锁相环相关拓扑,性能以及错锁问题梳理
  16. POJ 4110:圣诞老人的礼物-Santa Clau’s Gifts
  17. Android UI视图效果篇之仿QQ好友列表分组悬浮PinnedHeaderExpandableListView
  18. 中关村知识产权领军和重点示范企业申报,200万资金补助
  19. R-EACTR:一个设计现实网络战演习的框架
  20. 字节跳动 | 游戏研发岗第一批笔试(题解)

热门文章

  1. 移动端像素概念,viewport,适配
  2. 数据结构实验之栈与队列九:行编辑器
  3. 卷积神经网络初探 | 数据科学家联盟 http://dataunion.org/20942.html
  4. caffe windows 学习第一步:编译和安装(vs2012+win 64)
  5. Matlab与C++混合编程(依赖OpenCV)
  6. Java-- String源码分析
  7. 分布式消息系统:Kafka
  8. RobHess的SIFT源码分析:综述
  9. 中国计算机学会CCF推荐国际学术会议和期刊目录-软件工程/系统软件/程序设计语言
  10. 鸟哥的Linux私房菜(基础篇)- 第十九章、认识与分析登录文件