北邮操作系统实验-进程同步.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档