首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

哲学家就餐有关问题

2013-10-19 
哲学家就餐问题哲学家就餐问题:由Dijkstra提出并解决的哲学家进餐问题是典型的同步问题。 该问题是描述有五

哲学家就餐问题

哲学家就餐问题:
由Dijkstra提出并解决的哲学家进餐问题是典型的同步问题。 该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的无
张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时
边试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。
思路:
给每一只筷子创建一个信号量。如果有N只筷子就有N个信号量。奇数号的哲学家先拿他左边的筷子,在拿他右边的筷子,偶
数号哲学家则相反。


算法:
While(true){
If( i  %  2 == 0){//偶数号哲学家
P(左边筷子对应的信号量)
P(右边筷子对应的信号量)
拿起两只筷子吃饭
V(右边筷子对应的信号量)
V(左边筷子对应的信号量)
}else{ //奇数号哲学家
P(右边筷子对应的信号量)
P(左边筷子对应的信号量)
拿起两只筷子吃饭
V(左边筷子对应的信号量)
V(右边筷子对应的信号量)
}
吃饱后随意的睡上一段时间
}

代码:

#include <iostream>#include <windows.h>#include "semaphore.h"#include "thread.h"#define N 6using namespace std;Semaphore mutex[6] = {Semaphore(1), Semaphore(1), Semaphore(1), Semaphore(1), Semaphore(1), Semaphore(1)};unsigned int WINAPI hello(void * param){int id = *((int *) param);while(true){if(id%2==0){mutex[id].P();mutex[(id+1)%N].P();printf("哲学家%d吃饭\n", id+1);//cout <<"哲学家" <<id<<"吃饭"<<endl;mutex[(id+1)%N].V();mutex[id].V();}else{mutex[(id+1)%N].P();mutex[id].P();//cout <<"哲学家" <<id<<"吃饭"<<endl;printf("哲学家%d吃饭\n", id+1);mutex[id].V();mutex[(id+1)%N].V();}Sleep(100000);}}int main(){int Person_id[6] = {0, 1, 2, 3, 4, 5};int i;HANDLE hThread[6];for(i = 0; i < N; i++)hThread[i] = startThread(hello, &Person_id[i]);::WaitForMultipleObjects(6,hThread,TRUE,INFINITE);for(i = 0; i < N; i++)CloseHandle(hThread[i]);return 0;}


热点排行