哲学家就餐问题.doc

哲学家就餐问题.doc

ID:48454289

大小:34.00 KB

页数:3页

时间:2020-01-31

哲学家就餐问题.doc_第1页
哲学家就餐问题.doc_第2页
哲学家就餐问题.doc_第3页
资源描述:

《哲学家就餐问题.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 ;id

7、ndle(hPhilosopher[id]);  6.    }  7.    return 0;  8.}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。