计算机操作系统实验科学家进餐问题.docVIP

计算机操作系统实验科学家进餐问题.doc

  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文档。上传文档
查看更多
计算机操作系统实验科学家进餐问题

实验二:进程同步 一.实验目的 掌握基本的同步算法,理解生产者消费者模型。 学习使用Windows XP中基本的同步对象,掌握相关API的使用方法。 了解Windows XP中多线程的并发执行机制,实现进程的同步与互斥。 二.实验属性 该实验为设计性实验。 三.实验仪器设备及器材 普通PC386以上微机 四.实验要求 本实验要求2学时完成。 本实验要求完成如下任务: (1)以生产者/消费者模型为依据,在Windows XP环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 学习并理解生产者/消费者模型及其同步/互斥规则; 学习了解Windows同步对象及其特性; 熟悉实验环境,掌握相关API的使用方法; 设计程序,实现生产者/消费者进程(线程)的同步与互斥。 (2)扩展任务2选1: 1利用信号量机制,写出不会发生死锁的解决哲学家进程(线程)。 最多允许4个同时进餐; 奇:先左后右 偶:先右后左。 2利用信号量机制,写出不会发生死锁的读者写者进程(线程)。 五:实验内容: 利用至多同时允许4位哲学家同时去拿左边筷子的方法解决进餐死锁的问题。 实验详细设计: 程序首先创建一个线程参数结构体 struct ThreadInfo { int serial; double delay; }; 设置最多同时去拿筷子的人数 #define MAX_BUFFER_NUM 4 设置一个信号量数组用来表示五位哲学家的左右边的筷子 HANDLE chopstick [5]; 设置同时去拿筷子的人数的信号量 HANDLE People; 设置一个互斥信号量 HANDLE h_mutex; 在main()函数中,首先创建信号量: for (int i=0;i5;i++) { chopstick[i]=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,chopstick+i); } People=CreateSemaphore(NULL,MAX_BUFFER_NUM,MAX_BUFFER_NUM,People); h_mutex=CreateMutex(NULL,FALSE, mutex_for_update); 创建线程 for (int j=0;j(int)n_Thread;j++) { h_Thread[j]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(eat),(Thread_Info[j]),0,NULL); } 线程执行函数: void eat(void*p) { //局部变量声明 DWORD wait_for_semaphore1,wait_for_semaphore2,wait_for_People,wait_for_mutex,m_delay; int m_serial; //获得本线程信息 m_serial=((ThreadInfo*)(p))-serial; WaitForSingleObject(h_mutex,-1); WaitForSingleObject(People,-1); printf(哲学家 %2d 开始准备拿筷子.\n,m_serial); wait_for_semaphore1=WaitForSingleObject(chopstick[m_serial],-1); wait_for_semaphore2=WaitForSingleObject(chopstick[(m_serial+1)%5],-1); ReleaseSemaphore(People,1,NULL); ReleaseMutex(h_mutex); Sleep(1000); printf(哲学家 %2d 开始进餐.\n,m_serial); Sleep(1000); printf( 哲学家 %2d 结束进餐.\n,m_serial); ReleaseSemaphore(chopstick[m_serial],1,NULL); ReleaseSemaphore(chopstick[(m_serial+1)%5],1,NULL); //ReleaseSemaphore(People,1,NULL); } 六:实验结果调试 实验总结: 这次实验最主要的难点实在信号量的使用上,刚开始由于信号量使用的位置不是很正确,结果造成一些数据竞争,并且出现死锁的现象,后来经过仔细检查,最后终于正确的将各个信号

文档评论(0)

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

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

1亿VIP精品文档

相关文档