问题描述:

单个生产者,多个消费者,多个缓冲池,利用多线程通过同步互斥原则完成数据的读取。

解决方案:

生产者与消费者之间涉及同步问题,当缓冲池中有数据时,消费者才能去读取数据;当缓冲池有空余位置时,生产者才能去投进数据。同时又有互斥问题,对缓冲区必须互斥的访问。消费者之间涉及互斥,保证对数据的互斥访问。这里使用了信号量 Semaphore 和关键段 SCRITICAL_SECTION 完成同步和互斥问题。以下给出详细代码:

#include <iostream>
#include <process.h>
#include <windows.h>// 生产者消费者问题,单个生产者,多个消费者,多个缓冲池
// 使用 信号量  和 关键段 来实现using namespace std;int gi,gj;const int num = 10;  // 产生数据的个数
const int size = 4;  // 缓冲池的大小
volatile bool flag = true;  // 用于消费者线程之间int buf[size];  // 缓冲池CRITICAL_SECTION gc; // 关键段HANDLE empty,full; // Semaphoreunsigned int __stdcall pro(PVOID p)  // 生产者线程
{for(int i = 0; i <= num ; i++){WaitForSingleObject(empty,INFINITE);  // 线程同步EnterCriticalSection(&gc);  // 线程互斥buf[gi] = i;cout << "生产者在 " << gi << " 号缓冲池放入 " << buf[gi] << endl;gi = (gi+1)%size;LeaveCriticalSection(&gc);ReleaseSemaphore(full,1,NULL);}cout << "生产者运行结束!" << endl;return 0;}unsigned int __stdcall cus(PVOID p)  // 消费者线程
{while(true){WaitForSingleObject(full,INFINITE);  // 线程同步if( flag == false )  // 线程之间的逻辑判断{break;}EnterCriticalSection(&gc);  // 线程互斥cout << "线程 " << GetCurrentThreadId() << " 在缓冲池 " << gj << " 获取数据 " << buf[gj] << endl;if( buf[gj] == num )  // 结束条件{LeaveCriticalSection(&gc);ReleaseSemaphore(full,1,NULL);flag = false;break;}gj = (gj+1)%size;LeaveCriticalSection(&gc);Sleep(50);ReleaseSemaphore(empty,1,NULL);}cout << "消费者线程 " << GetCurrentThreadId() << " 运行结束!" << endl;return 0;
}int main()
{// 相关变量的定义const int sz = 3;gi = gj = 0;InitializeCriticalSection(&gc);empty = CreateSemaphore(NULL,4,4,NULL);full = CreateSemaphore(NULL,0,4,NULL);HANDLE hand[sz];hand[0] = (HANDLE)_beginthreadex(NULL,0,pro,NULL,0,NULL);  // 创建了三个线程hand[1] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);hand[2] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);WaitForMultipleObjects(sz,hand,true,INFINITE);//  资源的释放CloseHandle(full);CloseHandle(empty);DeleteCriticalSection(&gc);for(int i = 0; i < sz ; i++){CloseHandle(hand[i]);}return 0;}

运行结果:

操作系统:生产者消费者问题相关推荐

  1. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

  2. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

  3. 三、操作系统——生产者-消费者问题(两个同步一个互斥)

    一.问题描述 信号量机制实现进程互斥的步骤: 设置初值为1的互斥信号量 在访问临界区之间进行P操作 在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤: 设置初值为0的同步信号量 在前操作之后 ...

  4. 操作系统——生产者-消费者问题

    一.简单生产者-消费者问题 问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不为空时,消费者才能 ...

  5. 操作系统 - - 生产者—消费者问题(PV操作)代码显示

    生产者 - 消费者问题 假设在生产者和消费者之间的公用缓冲池具有n个缓冲区,可利用互斥信号量mutex实现诸进程的互斥使用:利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量. 又 ...

  6. 操作系统——生产者消费者模型以及信号量

    生产者--消费者问题是 多个进程因共享一个缓存区而产生的相互依赖问题 .具体来说,生产者进程往往要往共享缓存区中放内容.消费者进程从共享缓存中取内容, 当缓存区满的时候 ,生产者进程需要等待消费者进程 ...

  7. 操作系统 — 生产者消费者模型

    生产者消费者模型 所谓的生产者消费者模型就是一个类似于队列一样的东西串起来,这个队列可以想像成一个存放产品的"仓库",生产者只需要关心这个 "仓库",并不需要关 ...

  8. [操作系统]生产者/消费者问题

    生产者/消费者问题也叫缓存绑定问题(bounded- buffer),是一个经典的.多进程同步问题. 单生产者和单消费者 仓库容量为一的情况 问题分析: 仓库有空位时,生产者才能生产产品,并放入仓库中 ...

  9. (二十二)操作系统-生产者·消费者问题

    文章目录 一.问题描述 二.问题分析 三.PV操作题目分析步骤 1. 关系分析 2. 整理思路 3. 设置信号量 4. 编写代码 四.能否改变相邻P.V操作的顺序? 五.小结 1. PV操作题目的解题 ...

  10. 操作系统—生产者消费者

    问题描述及需求分析 实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素.要求实现生产者与消费者之间的同步,即当缓冲池为空时,消 ...

最新文章

  1. 机器学习数据预处理之缺失值:插值法填充+多项式插值
  2. 聚类的评价方法 轮廓系数
  3. WPF下如何去除WebBrowser的滚动条和捕获关闭事件
  4. 20180316 数组所占空间
  5. HDU - 1251 统计难题(字典树)
  6. java学习(47):带参无返回
  7. KDD CUP 2018:中国团队包揽前三名,TOP1方案出炉
  8. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——B题 小宝的幸运数组
  9. Android EventBus现实 听说你out该
  10. python除法运算定律_小数乘法和小数除法知识点整理(转)
  11. Matlab中zeros和ones函数用法
  12. Linux驱动学习--HCI框架及源码分析
  13. Elasticsearch 之(6)kibana嵌套聚合,下钻分析,聚合分析
  14. 论文导读:TOWARDS END-TO-END SPOKEN LANGUAGE UNDERSTANDING
  15. 一步步教你轻松学KNN模型算法
  16. 【逗老师带你学IT】ZoomRooms兼容硬件设计方案
  17. python-微信自动发送信息2
  18. 裤子尺寸参考与衣服尺寸参考
  19. vue3项目ts文件引入LodopFuncs.js打印控件
  20. coppeliasim(vrep)设置弹簧

热门文章

  1. UML模型设计中的关系
  2. 递归习题-一步一个脚印
  3. Linux下五笔输入法的安装
  4. 轮胎与车辆油耗的关系
  5. 简述C和C++程序员学习历程
  6. eclipse + cdt + mingw 一个Javaer的Win32
  7. 机器学习词汇翻译(1)
  8. 工业边缘网关-04配置静态IP地址
  9. CSS设置style属性的3种方法
  10. cadence版图——噪声