版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、进程管理实验报告1实验目的:(1)理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题;(2)了解windows系统或unix/linux系统下中信号量的使用方法。2实验内容编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次只能有一个生产者或消费者访问仓库。要求:采用信号量机制。3、环境说明本实验是在win7环境下使用dev编译器实现的,采用Win API的信号量机制。4、程序设计说明该程序根据教材中的消费者生产者问题编写的,使用了教材中提供的框架思路以及库函数,使用 CreateThread建立新
2、的线程,使用CreateMutex创建一个互斥信号量,使用CreateSemaphore创建信号量,使用ReleaseMutex释放线程的互斥信号量,使用ReleaseSemaphore对指定的信号量增加指定的值,使用WaitForSingleObject等待空位,使用CloseHandle在操作结束后关闭线程和信号量。在这个程序里我设计了三个函数: Int main()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等内容以及线程创建等内容DWORD WINAPI producer(LPVOID lpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作DWORD WINAPI c
3、onsumer(LPVOID lpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作 该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作,详细设计见源代码。5、程序运行结果截图:只有生产者请求,没有消费者请求,请求满足只有消费者请求,没有生产者请求,消费者的请求不成功:生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:消费者请求多于生产者请求,只能满足部分消费者请求,不能满足全部:6、源代码:#include <cstdio>#include <c
4、stdlib>#include <cstring>#include <iostream>#include <algorithm>#include <windows.h>using namespace std;#define MAX_BUF 1000#define MAX_REQ 20 HANDLE mutex;HANDLE full;HANDLE empty; HANDLE threadMAX_REQ;DWORD pro_idMAX_REQ;DWORD con_idMAX_REQ;struct request int type;/记录生产者
5、消费者的类型 int seq; /记录请求次序 reqMAX_REQ; int buf_size; int req_size; int no;int bufferMAX_BUF;int in;int out; int result;bool cmp(request a,request b) return a.seq<b.seq; DWORD WINAPI producer(LPVOID lpPara) WaitForSingleObject(full,INFINITE); WaitForSingleObject(mutex,INFINITE); printf("生产者%d将第%
6、d号产品放入缓冲区n",(int)lpPara,no); bufferin=no+; in=(in+1)%buf_size; printf("成功放入缓冲区!nn",(int)lpPara); ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); return 0; DWORD WINAPI consumer(LPVOID lpPara) WaitForSingleObject(empty,INFINITE); WaitForSingleObject(mutex,INFINITE); printf("消
7、费者%d将第%d号产品从缓冲区取出n",(int)lpPara,bufferout); bufferout=0; printf("成功从缓冲区取出!nn",(int)lpPara); ReleaseMutex(mutex); out=(out+1)%buf_size; ReleaseSemaphore(full,1,NULL); return 0; int main() int i; int p=0; no = 1; in=out=0; memset(buffer, 0, sizeof(buffer); printf("请设置缓冲区大小:");
8、 scanf("%d",&buf_size); printf("请输入请求使用资源进程的个数:"); scanf("%d",&req_size); for(i=0;i<req_size;i+) printf("请选择是消费者进程(0)还是生产者进程(1):"); scanf("%d",&reqi.type); printf("请输入该进程的请求时间:"); scanf("%d",&reqi.seq); sort(req
9、,req+req_size,cmp); mutex=CreateMutex(NULL,FALSE,NULL); full=CreateSemaphore(NULL,buf_size,buf_size,NULL); empty=CreateSemaphore(NULL,0,buf_size,NULL); for(i=0;i<req_size;i+) if(reqi.type=0) threadi=CreateThread(NULL, 0, consumer, (LPVOID)i, 0, &con_idi); if(threadi=NULL) return -1; printf(&q
10、uot;n消费者请求从缓冲区中取产品,请求时间为%dn",reqi.seq); if(reqi.type=1) threadi=CreateThread(NULL,0,producer,(LPVOID)i,0,&pro_idi); if(threadi=NULL) return -1; printf("n生产者请求往缓冲区中放产品,请求时间为%dn",reqi.seq); result = WaitForMultipleObjects(req_size, thread, TRUE, 500); if (result = WAIT_TIMEOUT) printf("n请求不能被完全满足n"); else printf("n能够满足所有请求 n"); for(int i=0; i<req_size; i+) CloseHandle(threadi); CloseHandle(mutex); CloseHandle(full); CloseHandle(empty); system("pause"); return 0;7、实验总结: 本次实验基于书上的生产者消费者问题,原理在上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年新教材高中地理第2章地表形态的变化章末总结探究课学案中图版选择性必修1
- 2024年磁性载体材料项目发展计划
- 玉溪师范学院《国际商法》2022-2023学年期末试卷
- 玉溪师范学院《地理信息系统原理》2023-2024学年第一学期期末试卷
- 2024年铌酸锂、钽酸锂单晶项目建议书
- 2024舞台出租合同范文
- 2024年高纯氧化铝合作协议书
- 苏教版四年级下册数学第三单元 三位数乘两位数 测试卷及参考答案【模拟题】
- 沪教版三年级下册数学第二单元 用两位数乘除 测试卷及参考答案(能力提升)
- 2024建筑工程劳务合同样本
- 《髌骨骨折骨折》课件
- 肾内科激素的用药知识-健康科普知识讲座课件
- 关于工商管理社会实践报告
- 《智能制造系统》课程标准
- 学校食堂调查方案
- 2024年航空职业技能鉴定考试-无人机AOPA驾驶证考试(视距内驾驶员视距内驾驶员)笔试历年真题荟萃含答案
- 激励理论-赫茨伯格的“双因素理论”案例分析课件
- JC-T 738-2004水泥强度快速检验方法
- 胸腔积液患者病例讨论
- 第六章-冷冻真空干燥技术-wang
- 科研的思路与方法
评论
0/150
提交评论