问题描述:
有五个哲学家围坐在一圆桌旁,桌*有一盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子。
解决方案:
-
至多允许四个哲学家同时吃;
Semaphore fork[5]={1,1,1,1,1}; Semaphore footman=4;//最多允许4个哲学家进程同时进行 cobegin process philosopher_i() ){/*i=0,1,2,3,4 */ while(true) { P(footman); Think(); P(fork[i]); P(fork[(i+1)%5]); Eat(); V(fork[i]); V(fork[(i+1)%5]); V(footman); } }
- 奇数号先取左手边的叉子,偶数号先取右手边的叉子;
- 每个哲学家取到手边的两把叉子才吃,否则一把叉子也不取。
-
系统中只允许有四个进程
semaphore fork[5]; for (int i=0;i<5;i++) fork[i]= 1; process philosopher_i( ){/*i=0,1,2,3 */ while(true) { think( ); P(fork[i]; /*i=4,P(fork[0])*/ P(fork[(i+1)%5] );/*i=4,P(fork[4])*/ eat( ); V(fork[i]); V(fork([i+1]%5); } }
(方案很多,但尽可能的找到最优的方案)