begin var stop1=0,stop2=0,run1=0,run2=0:semaphore; cobegin process driver begin repeat p(run1); p(run2); 启动车辆; 正常行驶; 到站停车; v(stop1); v(stop2); end process conductor1 begin repeat; 上乘客; 关车门; v(run1); 售票; p(stop1); 开车门; 下乘客; end process conductor2 begin repeat; 上乘客; 关车门; v(run2); 售票; p(stop2); 开车门; 下乘客; end coend end
注:这是售票员优先的方式,若以司机优先的方式,程序如下:
begin var stop1=0,stop2=0,run1=0,run2=0:semaphore; cobegin process driver begin repeat 正常行驶; 到站停车; v(stop1); v(stop2); p(run1); p(run2); end process conductor1 begin repeat; p(stop1); 开车门; 售票; 关车门; v(run1); end process conductor2 begin repeat; p(stop2); 开车门; 售票; 关车门; v(run2); end coend end
begin var s=1,t=1,sk=1,lt=1:semaphore; cobegin process p1 begin repeat p(s); p(sk); 通过sk路段; 进入安全岛M; v(sk); p(lt); 通过lt路段; v(lt); v(s); until false end process p2 begin repeat; p(t); p(lt); 通过sk路段; 进入安全岛M; v(lt); p(sk); 通过lt路段; v(sk); v(t); until false end coend end
begin var barber=0,customer=0,count=0,mutex=1:semaphore; cobegin process barber begin repeat p(customer); p(mutex); count = count -1; v(barber); v(mutex); 理发; until false end process customer begin repeat; p(mutex); if(count<n) end
begin var max_capacity=n,barber_chair=3,cust_ready=0,finished=0,leave_b_chair =0:semaphore; cobegin process barber begin repeat p(cust_ready); 理发; until false end process customer begin repeat; p(max_capacity);//是否有空闲椅子; 进入店里; p(barber_chair);//是否有空闲的理发椅; 坐在理发椅上; v(cust_ready);//唤醒理发师; p(finished);//是否完成理发; 离开理发椅; v(leave_b_chair); 离开店; v(max_capacity); until false end coend end
13.进程p0,p1共享变量flag,turn;他们进入临界区的算法如下:
var flag:array[0..1] of boolean;//初值为false turn:01 process i (0或1) whiletrue do begin flag[i] =true; while turn!=i do begin while flag[j]==false do skip;//skip为空语句 turn = i end 临界区; flag[i] =false; 出临界区; end
var flag:array[0..1] of boolean;//初值为false turn:01 process 0 whiletrue do begin flag[0] =true; turn =1 while flag[1]==true and turn =1 do skip;//skip为空语句 临界区; flag[0] =false; 出临界区; end process 0 whiletrue do begin flag[1] =true; turn =0 while flag[0]==true and turn =0 do skip;//skip为空语句 临界区; flag[1] =false; 出临界区; end