16
例题2:哲学家吃通心面问题
有五个哲学家围坐在一 圆桌旁,桌中央有一盘 通心面,每人面前有一 只空盘于,每两人之间 放一把叉子。每个哲学 家思考、饥饿、然后吃 通心面。为了吃面,每 个哲学家必须获得两把 叉子,且每人只能直接 从自己左边或右边去取 叉子 。
2021/6/7
17
var forki:array[0..4] of semaphore;
forki:=1;
cobegin
process Pi
/*i=0,1,2,3,4*/
begin
L1:
思考;
P(fork[i]);
P(fork[(i+1)mod 5]);
吃通心面;
V(fork[i]);
V(fork[(i+1)mod 5]);
goto L1;
end;
coend
2021/6/7
18
V(s):将信号量s加1,若结果不大于0, 则释放一个等待信号量s的进程。
2021/6/7
13
信号量与PV操作——记录型信号量(2)
推论1:若信号量s为正值,则该值等于在封锁 进程之前对信号量s可施行的P操作数、亦等于 s所代表的实际还可以使用的物理资源数
推论2:若信号量s为负值,则其绝对值等于登 记排列在该信号量s队列之中等待的进程个数、 亦即恰好等于对信号量s实施P操作而被封锁起 来并进入信号量s队列的进程数
临界区:进程访问临界资源的那段代码
2021/6/7
5
例题:
Lock和Unlock
X:代表临界资源状态Fra bibliotekX=0表示资源可用;X=1表示资源正在使用
Lock(x)
L: if x=1 then goto L ;/*正在使用,继续测试*/