S78用来制约M8的运行。
各进程的制约关系描述如下。
S12,S13,S14,S26,S36,S47,S57,S38,S78:semaphore;
S12:=0;S13:=0;S14:=0;S26:=0;S36:=0;S47:=0;S57:=0;S38:=0;S78:=0; COBEGIN
PROCESS M1: PROCESS M2: BEGIN BEGIN V(S12); P(S12); V(S13); V(S26); V(S14); END END
PROCESS M3: PROCESS M4: BEGIN BEGIN P(S13); P(S14); V(S36); V(S47); V(S38); END END
PROCESS M5: PROCESS M6: BEGIN BEGIN V(S57); P(S26); END P(S36); END
PROCESS M7: PROCESS M8 BEGIN BEGIN P(S47); P(S38); P(S57); P(S78); V(S78); END END COEND
3-16. 叉子是临界资源,在一段时间内只允许一个哲学家使用。一个信号量表示一把叉子,五个信号量构成信号量数组,这些信号量的初值为1。
int fork[0]=fork[1]=…=fork[4]=1; 第i个哲学家所执行的程序: do{ P(mutex); P(fork[i]);