- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北邮操作系统实验-进程同步
进程同步
1.实验目的:?
(1)理解进程/线程同步的方法,学会运用进程/线程同步的方法解决实际问题;?
(2)了解windows系统或unix/linux系统下中信号量的使用方法。?
2.实验内容?
编写一个有关生产者和消费者的程序:每个生产者每次生产一个产品存入仓库,每个消费者每次从仓库中取出一个产品进行消费,仓库大小有限,每次只能有一个生产者或消费者访问仓库。要求:采用信号量机制。?
3、环境说明?
本实验是在win7环境下使用dev编译器实现的,采用Win?API的信号量机制。?
4、程序设计说明?
该程序根据教材中的消费者生产者问题编写的,使用了教材中提供的框架思路以及库函数,使用CreateThread建立新的线程,使用CreateMutex创建一个互斥信号量,使用CreateSemaphore创建信号量,使用ReleaseMutex释放线程的互斥信号量,使用ReleaseSemaphore对指定的信号量增加指定的值,使用WaitForSingleObject等待空位,使用CloseHandle在操作结束后关闭线程和信号量。?
在这个程序里我设计了三个函数:?
Int?main()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等内容以及线程创建等内容?
DWORD?WINAPI?producer(LPVOID?lpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作?
DWORD?WINAPI?consumer(LPVOID?lpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作?
???该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作,详细设计见源代码。?
5、程序运行结果截图:?
?只有生产者请求,没有消费者请求,请求满足
生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:?
?
消费者请求多于生产者请求,只能满足部分消费者请求,不能满足全部:?
6、源代码:?
#include?cstdio?
#include?cstdlib?
#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?thread[MAX_REQ];?
DWORD??pro_id[MAX_REQ];?
DWORD??con_id[MAX_REQ];??
struct?request{?
int?type;//记录生产者消费者的类型?intseq;???//记录请求次序?}req[MAX_REQ];???
intbuf_size;??
intreq_size;?
?int?no;?
int?buffer[MAX_BUF];
?int?in;?
int?out;?
?int?result;??
boolcmp(request?a,request?b)?{?returna.seqb.seq;}??
DWORD?WINAPI?producer(LPVOID?lpPara)?{?
WaitForSingleObject(full,INFINITE);?
WaitForSingleObject(mutex,INFINITE);??
printf(生产者%d将第%d号产品放入缓冲区……\n,(int)lpPara,no);?buffer[in]=no++;?in=(in+1)%buf_size;?
printf(成功放入缓冲区!\n\n,(int)lpPara);??
ReleaseMutex(mutex);?
ReleaseSemaphore(empty,1,NULL);????
return?0;?
?}???
DWORD?WINAPI?consumer(LPVOID?lpPara)?{?
WaitForSingleObject(empty,INFINITE);?
WaitForSingleObject(mutex,INFINITE);???
printf(消费者%d将第%d号产品从缓冲区取出……\n,(int)lpPara,buffer[out]);????buffer[out]=0;??
printf(成功从缓冲区取出!\n\n,(int)lpPara);??
ReleaseMutex(mutex);?
out=(out+1)%buf_size;?
ReleaseSema
文档评论(0)