哲学家就餐问题

更新时间:2023-08-29 20:33:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

哲学家就餐问题的解决方法(C++版本)

P、V原语解决哲学家就餐问题(C++版本) 六个哲学家一起就餐,六只筷子。

为防止哲学家饿死的情况,制定如下规则:

规则:

(1)奇数号的哲学家先拿起右边的筷子再拿起左边的筷子。

(2)偶数号哲学家先拿起左边的筷子,再拿起右边的筷子。

(3)如果哲学家抢到一只筷子,在抢占另一只筷子时失败,则要放弃已经抢占到的资源。

(4)左右两边都抢到筷子的哲学家,吃完放后释放资源。

源代码如下: 1. #include <windows.h>

2. #include "semaphore.h"

3. #include "thread.h"

4. #include <iostream>

5. #include <stdio.h>

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.

哲学家就餐问题的解决方法(C++版本)

16. void Philosopher(int id)

17. {

18. while (true)

19. {

20. if (id%2 == 0) //偶数号哲学家

21. {

22. ChopStick[id].P(); //拿起左边的筷子

23. ChopStick[(id+1)%N].P(); //拿起右边的筷子

24. printf("哲学家%d:正在吃饭/n",id); //左右都得到筷子则吃

25. ChopStick[id].V(); //释放左边信号量

26. ChopStick[(id+1)%N].V();//释放右边信号量

27. }

28. else if(id%2==1 ) //奇数号哲学家

29. {

30. ChopStick[(id+1)%N].P(); //拿起右边的筷子

31. ChopStick[id].P();//拿起左边的筷子

32. printf("哲学家%d:正在吃饭/n",id); //左右都得到筷子则吃

33. ChopStick[(id+1)%N].V(); //先后释放右左信号量

34. ChopStick[id].V();

35. }

36. Sleep(rand()%1000); //吃完睡上一会儿

37. }

38. }

39.

40. int main()

41. {

42. HANDLE hPhilosopher[N]; //为每个哲学家分配一个线程

43. for (int id =0 ;id<N;id++) //开启线程

44. {

45. hPhilosopher[id] = startThread(Philosopher,id);

哲学家就餐问题的解决方法(C++版本)

46. }

47. ::WaitForMultipleObjects(N,hPhilosopher,TRUE,INFINITE);

48. for (int id = 0 ; id<N;id++)

49. {

50. CloseHandle(hPhilosopher[id]);

51. }

52. return 0;

53. }

本文来源:https://www.bwwdw.com/article/xd2i.html

Top