问题分析:

①假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。

②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。

流程图:

生产者:

消费者:


伪代码:

mutex,full,empty:semaphore
mutex :=1;
full:=0;
empty:=n;生产者P:
Wait(empty);
Wait(mutex);
Buffer(in)=nextp;
in:=(in+1) mod n;
Signal(mutex);
Signal(full);消费者C:
Wait(full);
Wait(mutex);
netxc=buffer(out);
out:=(out+1) mod n;
Signal(mutex);
Signal(empty);

源码:

#include<Windows.h>
#include<stdio.h>
#include<conio.h>
#include<fstream>
#include<iostream>
using namespace std;
#define sleep(n) Sleep(n*1000)
const int MAX_NUM = 10; //定义产品数
struct ThreadInfo
{int tid;    //线程IDchar role;  //扮演角色double delay; //线程延迟double persist; //线程读写操作持续时间
};
HANDLE Empty;  //局部临界资源
HANDLE Full;
CRITICAL_SECTION P_mutex;  //全局临界资源int in = 0; //第一个资源
int out = 0;  //最后一个资源
int buffer[MAX_NUM] = {}; //缓冲区
int current = 0; //生产者进程
void ProducerThread(void *p)
{DWORD m_delay; //延迟时间 DWORD m_persist; //持续时间 DWORD wait_for_empty;int m_id;   //id //从参数中获得信息 m_delay = ((ThreadInfo*)(p))->delay;m_persist = ((ThreadInfo*)(p))->persist;m_id = ((ThreadInfo*)(p))->tid;sleep(m_delay);  //让线程休眠时间==延迟时间 printf("Producer %d sents the producing require !\n", m_id);    //生产者发送生产请求 wait_for_empty = WaitForSingleObject(Empty, -1);   EnterCriticalSection(&P_mutex); //进入临界区printf("Producer %d begins to produce product !\n", m_id);buffer[in] = current++;   //生产产品 in = (in + 1) % MAX_NUM;sleep(m_persist);printf("Producer %d finished producing !\n", m_id); //生产者完成操作ReleaseSemaphore(Full, 1, NULL);   //V(full) printf("缓冲区+1\n");LeaveCriticalSection(&P_mutex);    //V(mutex) printf("Producer %d releases the power !\n", m_id);
}
//消费者进程
void ConsumerThread(void *p)
{DWORD m_delay; //延迟时间 DWORD m_persist; //持续时间 DWORD wait_for_full_mutex;int m_id;  //id //从参数中获得信息 m_delay = ((ThreadInfo*)(p))->delay;m_persist = ((ThreadInfo*)(p))->persist;m_id = ((ThreadInfo*)(p))->tid;sleep(m_delay);  //让线程休眠时间==延迟时间 printf("Comsumer %d sents the consuming require !\n", m_id);    //消费者发送消费请求 WaitForSingleObject(Full, -1);  //P(full);EnterCriticalSection(&P_mutex);   //P(mutex) printf("Consumer %d begins to consume product !\n", m_id);buffer[out] = -1; //进行消费 out = (out + 1) % MAX_NUM;current--;sleep(m_persist);printf("Consumer %d finished consuming !\n", m_id); //消费者完成消费操作 ReleaseSemaphore(Empty, 1, NULL);   //V(empty) printf("缓冲区-1\n");LeaveCriticalSection(&P_mutex);    //(mutex) printf("Comsumer %d releases the power\n", m_id);
}
int main(void)
{system("color 3f"); //改变颜色DWORD n_thread = 0;  //线程数目DWORD thread_ID;     //线程IDHANDLE h_thread[20];  //线程对象数组ThreadInfo thread_info[20];//初始化同步对象Full = CreateSemaphore(NULL, 0, MAX_NUM, "mutex_for_full");Empty = CreateSemaphore(NULL, MAX_NUM, MAX_NUM, "mutex_for_empty");InitializeCriticalSection(&P_mutex);//读取输入文件ifstream inFile;inFile.open("test2.txt");if (!inFile) {printf("error in open file !\n");return -1;}cout << "Producer and Consumer:" << endl;while (inFile){inFile >> thread_info[n_thread].tid;inFile >> thread_info[n_thread].role;inFile >> thread_info[n_thread].delay;inFile >> thread_info[n_thread++].persist;inFile.get();}for (int i = 0; i < (int)(n_thread); i++){if (thread_info[i].role == 'P'){//创建读者进程h_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ProducerThread), &thread_info[i], 0, &thread_ID);}else if (thread_info[i].role == 'C'){//创建写线程 h_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ConsumerThread), &thread_info[i], 0, &thread_ID);}}//等待所有的线程结束 DWORD wait_for_all = WaitForMultipleObjects(n_thread, h_thread, TRUE, -1);CloseHandle(Full);CloseHandle(Empty);cout << "All producer and consumer have finished operating !" << endl;_getch();return 0;
}

test.txt内容:

1 P 3 5
2 C 4 5
3 P 5 2
4 P 6 5
5 C 5.1 3

结果:

操作系统生产者与消费者问题代码实现相关推荐

  1. 计算机操作系统生产者和消费者模型的简单介绍

    同步互斥小口诀 画图理解题目 判断题目类型 分析进程数目 填写进程模板 补充基本代码(伪代码) 补充PV代码 检查调整代码 注意事项 代码是一步一步写出来的,代码是反复调整写出来的 60%是生产者和消 ...

  2. c++多线程生产者与消费者问题代码

    1.目录结构 2.代码 BufferPool.h #ifndef BUFFERPOOL #define BUFFERPOOL #include<windows.h> #include< ...

  3. 操作系统之经典 | 生产者与消费者问题

    文章目录 一.生产者消费者问题概述 二.生产者消费者模型优点 三.生产者消费者模型变量定义 四.生产者消费者流程图 五.代码 一.生产者消费者问题概述 描述:俩个或者更多的线程共享同一个缓冲区,其中一 ...

  4. 操作系统之生产者与消费者

    生产者消费者模型描述 生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为"生产者"会不断地向缓冲区中添加数据,另一个或者多个进 ...

  5. kafka学习总结(含java生产者、消费者、Topic操作代码)

    kafka(http://kafka.apache.org)是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率.它的优点是能够直接使用磁盘进行存储.线性读写.速度快,避免了数据在JVM内存和系统内 ...

  6. Java中生产者和消费者总结

    生产者和消费者问题是线程模型中的经典问题,生产者和消费者在同一时间段共用同一个存储空间,这个存储空间是一个缓冲区的仓库,生产者可以将产品放入仓库,消费者可以从仓库中取出产品. 生产者/消费者模型是基于 ...

  7. 生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题

    在上一篇操作系统基础14提到通过信号量解决生产者消费者问题.本篇来详细说说操作系统中的经典问题-生成者消费者问题 生产者消费者问题 (Producer-consumer problem) 该问题是一个 ...

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

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

  9. delphi生产者消费者模式代码_并发设计模式:生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

最新文章

  1. 用c语言编一个贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  2. Android IntentService解析
  3. 2018年我国视频监控市场趋势:智能视频分析进入规模化
  4. CICD - Teamcity 配置之一: 数据库自动部署
  5. java中struts2框架,概述Java的struts2框架
  6. Java批量下载有道单词发音+与Anki卡片整合
  7. 堆排序算法思路以及Java实现
  8. C语言找n以上最小质数,[原创]求质数(C语言描述)
  9. DEL计算机英语翻译,哥德尔计算机,G·del computer,音标,读音,翻译,英文例句,英语词典...
  10. 百度地图导航工具类,包含骑行步行及驾车导航
  11. Python 爬取微信公众号文章和评论 (有源码)
  12. GYM 2015 ACM Syrian Collegiate Programming Contest
  13. NG_ML_Cousera_Summary
  14. 「docker实战篇」python的docker爬虫技术-安卓模拟器(二)
  15. 查看Android应用内存的方法,Android获取App内存使用情况的方法
  16. idea 报错Output directory is not specified错误
  17. java 判断字符串重排后是否等于另一个字符串,包括空格符
  18. HoloView 在 jyputer lab/notebook 不显示总结
  19. 简单讲述SMTP 电子邮件标题注入
  20. CSP 201912-1 报数

热门文章

  1. 数据库软件基础搭建的思考(WAMPserver)
  2. 张小龙:如何把产品做简单(转)
  3. 金蝶云苍穹点击按钮出现F7列表弹窗,并获取选择中行的数据
  4. “大数据”时代的“解密人”
  5. 暴力破解pdf文档密码
  6. se linux影响性能,性能 | SELinux+
  7. matlab二进制数组必须,二进制数组操作的数组维度必须匹配。
  8. Prophet的原理知识
  9. 全球与中国有机大米市场深度研究分析报告(2022)
  10. linux编译器更新,英特尔 Fortran 编译器 Linux 版