OS实验6——信号量.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OS实验6——信号量

实验六 信号量一、实验内容(1)生产者/消费者问题:在windows和linux操作系统上,利用各自操作系统提供的mutex和信号量机制,实现生产者/消费者问题。具体要求见“Operating System Concepts(Seventh Edition)”Chapter 6后的project。(2)利用信号量解决读者——写者问题(选做)。二、实验目的通过实验,熟练掌握进程同步和互斥算法,理解生产者/消费者问题;掌握windows和linux中多进程/线程的同步互斥方法的使用。三、设计思路1、创建三个信号量:mutex,full,empty。2、主程序分别创建10个生产者线程和10个消费者线程。3、生产者线程:睡眠一段随机时间;向缓冲区插入一个随机数。4、消费者线程:睡眠一段随机时间;从缓冲区内取出一项。5、主程序睡眠一段时间后结束整个程序。四、源程序及注释1、windows#include windows.h#include string.h#include time.h#include stdlib.h#include stdio.h#define BUFFER_SIZE 5int buffer[BUFFER_SIZE];intcnt=0;//现有产品数量//定义并初始化信号量HANDLE mutex,empty,full;void init(){mutex=CreateMutex(NULL,FALSE,NULL);empty=CreateSemaphore(NULL,5,5,NULL);full=CreateSemaphore(NULL,0,5,NULL);}intinsert_item(intitem,int order){//向缓冲插入一个随机量int flag=-1;WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);//临界区if (cntBUFFER_SIZE){buffer[cnt++]=item;flag=0;//插入成功printf(producer %d produced %d\n,order,cnt);}ReleaseMutex(mutex);ReleaseSemaphore(full,1,NULL);return flag;}intremove_item(int item,int order){//删除缓冲区最后一个量int flag=-1;WaitForSingleObject(full,INFINITE);WaitForSingleObject(mutex,INFINITE);//临界区if (cnt0){item=buffer[cnt-1];buffer[cnt-1]=0;flag=0;printf(consumer %d consumed %d\n,order,cnt);cnt--;}ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);return flag;}DWORD WINAPI producer(void *param){srand((unsigned)time(NULL));int random;while (true){Sleep((rand()%10+1)*1000);random=rand()%50+1;if (insert_item(random,(DWORD)param))printf(report error condition\n);}}DWORD WINAPI consumer(void *param){srand((unsigned)time(NULL));int random;while (true){Sleep((rand()%10+1)*1000);if (remove_item(random,(DWORD)param))printf(report error condition\n);}}int main(intargc,char *argv[]){init();//主线程睡眠时间static constintsleepTime=10000;//生产者线程数量static constintproducerThs=10;//消费者线程数量static constintconsumerThs=10;//缓存区初始化memset(buffer,0,sizeof buffer);DWORD ProducerThreadId[producerThs];DWORD ConsumerThreadId[consumerThs];HANDLE ProducerThreadHandles[producerThs];HANDLE C

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档