0PA:beginL1:read from disk; P(avail1);
put to buffer1;
V(full1);
goto L1;
End;
PB:beginL2:P(full1);
get from buffer1;
V(avail1);
P(avail2);
put to buffer2;
V(full2);
goto L2;
End;
PC:beginL3: P(full2);
get from buffer2;
V(avail2);
print RECORD;
goto L3 end ;
Cobegin PA;PB;PC;Coend.
第一步:确定进程间的关系。
售票员关车门后,要向司机发开车信号,司机接到开车信号后才能启动车辆。
在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门,让乘客上下车。
因此司机启动车辆的动作必须与售票员的动作取得同步;售票员开车门的动作也必须同司机停车取得同步。
第二步:确定信号量及其值。
由于司机与售票员之间要互通消息,司机进程设置一个私有信号量run,用于判断是否关车门,司机能否启动车辆,初值为1。
售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0 第三步: 确定P(wait)、V(signal)操作的位置司机操作中,是否关门?没关则等待,这是一个P操作,P(run); 司机操作中,设立停车标志,这是一个V操作,V(stop); 售票员操作中,是否停车?没停则等待,这是一个P操作,P(stop); 售票员操作中,设立关门标志,这是一个V 操作,V(run)
lstop ,run:semaphore run:=1;
//是否关车门stop:=0;
//是否停车Driver:begin cobegin driver: begin L1: P(run);
启动车辆;
正常行车;
到站停车;
V(stop); goto L1; end; Conductor:begin L2:上乘客; 关车门;
V(run);
售票;
P(stop);
开车门;
下乘客;
goto L2;
end;
coend;
end;。