版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统 实验一姓名:廖桉冬 学号:09012431日期:15/4/29实验内容:在Windows和Linux操作系统上,利用各自操作系统提供的Mutex和信号量机制(Win32 API或Pthreads),实现生产者/消费者问题。具体要求见”Operating System Concepts(Seventh Edition)” Chapter 6后的Project(P236-241)。实验目的:通过实验,理解Win32 API、Pthreads中mutex locks、semaphores等使用方法,并掌握如何利用它们实现进程(线程)间的同步和互斥。设计思路和流程图生产者/消费者主要考虑两个
2、同步问题:1、 产品队列被两者共同访问,因此需要保持产品变化的互斥性;2、 产品有上限,因此生产者不能无限生产,多个生产者应该保持同步;消费者亦然。/生产者Do/produce an itemWait(empty);/队列有空位才能将产品放入Wait(mutex);/互斥访问队列/add productSignal(mutex);Signal(full);/告诉消费者有产品可以取用/消费者DoWait(full);/队列有产品才能消费Wait(mutex);/互斥访问队列/consume productSignal(mutex);Signal(full);/告诉生产者队列有空位主要数据结构及其
3、说明int BuffM:有限缓冲队列HANDLE/sem_t Mutex:互斥锁HANDLE/sem_t Full/Empty:队列有物品/空位的信号源程序并附上注释/WIN32#include <iostream>#include<stdio.h>#include <stdlib.h>#include <time.h>/系统调用#include<windows.h>#include<process.h>using namespace std;#define M 10#define Random_Max 50/插入随机数最
4、大值int buffM=0; /缓冲区大小为10int in=0;/生产者下标int out=0;/消费者下标int prod_id=0,proc_id=0;/初始化idbool con=true;HANDLE Empty=NULL; /空缓冲信号量HANDLE Full=NULL;/满缓冲信号量HANDLE Mutex=NULL;/缓冲区互斥锁void produce();void consume();UINT _stdcall ThreadProd(LPVOID);UINT _stdcall ThreadCons(LPVOID);/生产void produce()/随机产生“产品”放入队列
5、srand(time(0);int j = rand() % Random_Max;buffin=j;/打印生产信息cout<<" produce "<<j<<" into buffer"<<endl;/指针移动,下一个空项in = (in+1)%M;/消费void consume()cout<<" consume "<<buffout<<" from buffer"<<endl;/指针移动,下一个满项out = (ou
6、t+1)%M;/生产者入口函数UINT _stdcall ThreadProd(LPVOID)int id=+prod_id;while(1) /初始化srand(time(0);int i = rand() % 1000; Sleep(i+3000);/等待队列空WaitForSingleObject(Empty,INFINITE);/等待互斥锁WaitForSingleObject(Mutex,INFINITE);/打印生产者信息cout<<"Producer:"<<id;/生产produce();/释放semaphoreReleaseSemap
7、hore(Full,1,NULL);ReleaseSemaphore(Mutex,1,NULL);return 0;/消费者入口函数UINT _stdcall ThreadCons(LPVOID)int id=+proc_id;while(1)/初始化srand(time(0);int i = rand() % 1000;Sleep(i);/等待队列WaitForSingleObject(Full,INFINITE);/等待互斥锁WaitForSingleObject(Mutex,INFINITE);cout<<"Consumer:"<<id;/消费
8、consume();/释放ReleaseSemaphore(Empty,1,NULL);ReleaseSemaphore(Mutex,1,NULL);return 0;void main()/标识主进程UINT uId;int prod_num,cons_num,runtime;cout<<"请输入生产者个数和消费者个数:"cin>>prod_num>>cons_num;cout<<"请输入运行时间"cin>>runtime;/线程标识HANDLE *h_producer = new HANDL
9、Eprod_num;HANDLE *h_consumer = new HANDLEcons_num;/初始化Empty = CreateSemaphore(NULL,M,M,NULL);/ 缓冲区满,无法生产Full = CreateSemaphore(NULL,0,M,NULL);/缓冲区空,无法消费Mutex = CreateSemaphore(NULL,1,1,NULL);/ 线程互斥/创建N个生产者int i;for(i=0;i<prod_num;i+) h_produceri=(HANDLE):_beginthreadex(NULL,0,ThreadProd,NULL,0,&a
10、mp;uId);/创建N个消费者for(i=0;i<cons_num;i+) h_consumeri=(HANDLE):_beginthreadex(NULL,0,ThreadCons,NULL,0,&uId);Sleep(runtime);/LINUX(Pthread)#include <pthread.h>#include <semaphore.h>#include <iostream>#include <stdlib.h>#include <unistd.h>#include <time.h>#incl
11、ude <stdio.h>using namespace std;#define M 10#define Random_Max 50int buffM=0; int prod_id=0;sem_t Empty;sem_t Full;sem_t Mutex; void produce();void consume();void *producer(void *);void *consumer(void *);void produce()srand(time(0);int j = rand() % Random_Max;buffin=j;cout<<" produ
12、ce "<<j<<" into buffer"<<endl;in = (in+1)%M;void consume()cout<<" consume "<<buffout<<" from buffer"<<endl;out = (out+1)%M;void *producer(void *arg)int id=+prod_id;while(1)srand(time(0);int i = rand() % 5; sleep(i);sem_wait
13、(&Empty);sem_wait(&Mutex);cout<<"Producer"<<id;produce();sem_post(&Full);sem_post(&Mutex);cout<<"end"<<endl;return 0;void *consumer(void *arg)int id=+prod_id;while(1)srand(time(0);int i = rand() % 5;sleep(i);sem_wait(&Full);sem_wait(&am
14、p;Mutex);cout<<"Consumer "<<id;consume();sem_post(&Empty);sem_post(&Mutex);return 0;int main()int prod_num,cons_num,runtime;cout<<"input producer and consumer number:"cin>>prod_num>>cons_num;cout<<"input how long main sleep:"c
15、in>>runtime;pthread_t *h_producer = new pthread_tprod_num;pthread_t *h_consumer = new pthread_tcons_num;sem_init(&Empty,0,M);sem_init(&Full,0,0);sem_init(&Mutex,0,1); int i;for(i=0;i<prod_num;i+)pthread_create(&h_produceri, NULL,producer, NULL);for(i=0;i<cons_num;i+)pthread_create(&h_consumeri, NULL,consumer, NULL);sleep(runtime);程序运行时的初值和运行结果消费者:10 生产者:10 运行时间:6000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药物微生物检定员安全生产基础知识能力考核试卷含答案
- 高分子防水卷材生产工变更管理知识考核试卷含答案
- 两栖类繁育工班组协作考核试卷含答案
- 化学铣切工班组建设模拟考核试卷含答案
- 扬声器装调工安全实践竞赛考核试卷含答案
- 圆珠笔制造工岗前基础实战考核试卷含答案
- 四年级数学下册第三单元第七课时《手拉手》教学设计
- 2025年辽宁省公需课学习-主要污染物总量减排监测办法
- 护理护理心理支持课件制作
- 2026年高标准农田建设中心招聘真题及参考答案
- 6.1.2 有性生殖(教学设计)生物新教材人教版八年级下册
- GB/T 46584-2025精细陶瓷界面恒定振幅下室温拉伸和剪切疲劳性能试验方法十字交叉法
- 程序员私人合同范本
- 截肢护理小讲课
- 2025年考研法硕(非法学)真题含答案解析
- 脑疝护理应急预案
- 学习与解读国家十五五规划
- 2025年内蒙化工单招考试题及答案
- 2025年重庆市公务员考试公安岗位专项卷
- 2025年学位英语山东题库及答案
- 《教育系统重大事故隐患判定指南》深度解读课件
评论
0/150
提交评论