哲学家就餐问题.doc_第1页
哲学家就餐问题.doc_第2页
哲学家就餐问题.doc_第3页
全文预览已结束

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

P、V原语解决哲学家就餐问题(C+版本) 六个哲学家一起就餐,六只筷子。为防止哲学家饿死的情况,制定如下规则:规则:(1)奇数号的哲学家先拿起右边的筷子再拿起左边的筷子。(2)偶数号哲学家先拿起左边的筷子,再拿起右边的筷子。(3)如果哲学家抢到一只筷子,在抢占另一只筷子时失败,则要放弃已经抢占到的资源。(4)左右两边都抢到筷子的哲学家,吃完放后释放资源。源代码如下:1. #include 2. #includesemaphore.h 3. #includethread.h 4. #include 5. #include 6. #defineN6/哲学家的个数 7. /-参数说明:- 8. /id左边的筷子 9. /(id+1)%N右边的筷子 10. /哲学家和筷子都是从0开始编号 11. /编号为N的哲学家的右边的筷子编号为0 12. 13. /初始化信号量 14. SemaphoreChopStickN=1,1,1,1,1,1;15. 16. voidPhilosopher(intid)17. 18. while(true)19. 20. if(id%2=0)/偶数号哲学家 21. 22. ChopStickid.P();/拿起左边的筷子 23. ChopStick(id+1)%N.P();/拿起右边的筷子 24. printf(哲学家%d:正在吃饭/n,id);/左右都得到筷子则吃饭 25. ChopStickid.V();/释放左边信号量 26. ChopStick(id+1)%N.V();/释放右边信号量 27. 28. elseif(id%2=1)/奇数号哲学家 29. 30. ChopStick(id+1)%N.P();/拿起右边的筷子 31. ChopStickid.P();/拿起左边的筷子 32. printf(哲学家%d:正在吃饭/n,id);/左右都得到筷子则吃饭 33. ChopStick(id+1)%N.V();/先后释放右左信号量 34. ChopStickid.V();35. 36. Sleep(rand()%1000);/吃完睡上一会儿 37. 38. 39. 40. intmain()41. 42. HANDLEhPhilosopherN;/为每个哲学家分配一个线程 43. for(intid=0;idN;id+)/开启线程 44. 45. hPhilosopherid=startThread(Philosopher,id);46. 47. :WaitForMultipleObjects(N,hPhilosopher,TRUE,INFINITE);48. for(intid=0;idN;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论