哲学家就餐问题

上传人:kms****20 文档编号:37830127 上传时间:2018-04-23 格式:DOC 页数:3 大小:35KB
返回 下载 相关 举报
哲学家就餐问题_第1页
第1页 / 共3页
哲学家就餐问题_第2页
第2页 / 共3页
哲学家就餐问题_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《哲学家就餐问题》由会员分享,可在线阅读,更多相关《哲学家就餐问题(3页珍藏版)》请在金锄头文库上搜索。

1、/*inux 进程的实现:哲学家就餐问题在 linux 上的程序实现设有 5 个哲学家,共享一张放油把椅子的桌子,每人分得一吧椅子.但是桌子上总共只有 5 支 筷子,在每个人两边分开各放一支.哲学家只有在肚子饥饿时才试图分两次从两边拾起筷子就 餐.就餐条件是:1)哲学家想吃饭时,先提出吃饭的要求;2)提出吃饭要求,并拿到 2 支筷子后,方可吃饭;3)如果筷子已被他人获得,则必须等待该人吃完饭之后才能获取该筷子;4)任一哲学家在自己未拿到 2 支筷子吃饭之前,决不放下手中的筷子;5)刚开始就餐时,只允许 2 个哲学家请求吃饭.试问:1)描述一个保证不会出现两个邻座同时要求吃饭的算法;2)描述一个

2、既没有两邻座同时吃饭,又没有人饿死的算法;3)在什么情况下,5 个哲学家全都吃不上饭?哲学家进餐问题是典型的同步问题.它是由 Dijkstra 提出并解决的.该问题是描述有五个 哲学家,他们的生活方式是交替地进行思考和进餐.哲学家们共用一张圆桌,分别坐在周围的 五张椅子上.在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其 左右岁靠近他的筷子,只有在他拿到两支筷子时才能进餐.进餐完毕,放下筷子继续思考.*/#include #include #include #include #include #include /#include “RasUtil.h“ using nam

3、espace std; const unsigned int PHILOSOPHER_NUM=5; const char THINKING=1; const char HUNGRY=2; const char DINING=3; sem_t semphPHILOSOPHER_NUM; / each fork has a semaphore pthread_mutex_t mutex; / Mutex for printing void* philosopherProc(void* param); int main(int argc, char* argv) int i; srand(getpi

4、d(); pthread_t philosopherThreadPHILOSOPHER_NUM; /定义线程数组int phIdPHILOSOPHER_NUM; pthread_mutex_init( for (i=0; iPHILOSOPHER_NUM; i+) phIdi = i; sem_init( /对每只筷子信号量进行初始化为当前进程的局部 信号量pthread_create( /以 philosopherProc 为原型创建 PHILOSOPHER_NUM 个线程usleep(5000); sleep(30); return 0; void* philosopherProc(voi

5、d* param) int myid; char stateStr128; char mystate; int ret; unsigned int leftFork; unsigned int rightFork; myid = *(int*)(param); cout “philosopher “ myid “ begin.“ endl; usleep(1000000); /把进程挂起一段时间, 单位是微秒(百万分之一秒) ;/ initial state is THINKING mystate = THINKING; leftFork = (myid) % PHILOSOPHER_NUM;

6、 rightFork = (myid + 1) % PHILOSOPHER_NUM; while (true) switch(mystate) case THINKING: / changing my state mystate = HUNGRY; strcpy(stateStr, “HUNGRY“); break; case HUNGRY: strcpy(stateStr, “HUNGRY“); / first test the left fork . ret = sem_trywait( if (ret = 0) / left fork is ok, take it up ,then te

7、st the right fork . ret = sem_trywait( if (ret = 0) / right fork is also ok ! changing my state mystate = DINING; strcpy(stateStr, “DINING“); else / right fork is being used by others, so I must put down the left fork. sem_post( break; case DINING: / put down both the left and right fork sem_post( s

8、em_post( / changing my state mystate = THINKING; strcpy(stateStr, “THINKING“); break; / print my state pthread_mutex_lock( cout “philosopher “ myid “ is : “ stateStr endl; pthread_mutex_unlock( / sleep a random time : between 1 - 5 s int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0); usleep(sleepTime*100000);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号