欢迎来到天天文库
浏览记录
ID:48454289
大小:34.00 KB
页数:3页
时间:2020-01-31
《哲学家就餐问题.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、P、V原语解决哲学家就餐问题(C++版本)六个哲学家一起就餐,六只筷子。为防止哲学家饿死的情况,制定如下规则:规则:(1)奇数号的哲学家先拿起右边的筷子再拿起左边的筷子。(2)偶数号哲学家先拿起左边的筷子,再拿起右边的筷子。(3)如果哲学家抢到一只筷子,在抢占另一只筷子时失败,则要放弃已经抢占到的资源。(4)左右两边都抢到筷子的哲学家,吃完放后释放资源。源代码如下:1.#include 2.#include "semaphore.h" 3.#include "thread.h" 4.#include
2、 5.#include 6.#define N 6 //哲学家的个数 7.//----------参数说明:----------------- 8.// id 左边的筷子 9.// (id+1)%N 右边的筷子 10.//哲学家和筷子都是从0开始编号 11.//编号为N的哲学家的右边的筷子编号为0 12. 13.//初始化信号量 14.Semaphore ChopStick[N]={1,1,1,1,1,1} ; 15. 1.void Philosopher(int
3、id) 2.{ 3. while (true) 4. { 5. if (id%2 == 0) //偶数号哲学家 6. { 7. ChopStick[id].P(); //拿起左边的筷子 8. ChopStick[(id+1)%N].P(); //拿起右边的筷子 9. printf("哲学家%d:正在吃饭/n",id); //左右都得到筷子则吃饭 10.
4、 ChopStick[id].V(); //释放左边信号量 11. ChopStick[(id+1)%N].V();//释放右边信号量 12. } 13. else if(id%2==1 ) //奇数号哲学家 14. { 15. ChopStick[(id+1)%N].P(); //拿起右边的筷子 16. ChopStick[id].P();//拿起左边的筷子 17. prin
5、tf("哲学家%d:正在吃饭/n",id); //左右都得到筷子则吃饭 18. ChopStick[(id+1)%N].V(); //先后释放右左信号量 19. ChopStick[id].V(); 20. } 21. Sleep(rand()%1000); //吃完睡上一会儿 22. } 23.} 24. 25.int main() 26.{ 27. HANDLE hPhilosopher[N]; //为每
6、个哲学家分配一个线程 28. for (int id =0 ;id7、ndle(hPhilosopher[id]); 6. } 7. return 0; 8.}
7、ndle(hPhilosopher[id]); 6. } 7. return 0; 8.}
此文档下载收益归作者所有