设一辆公共汽车上,司机和售票员的活动分别是 :司机:启动车辆,正常行车,到站停车;售票 员:上乘客,

1个回答

  • 第一步:确定进程间的关系.售票员关车门后,要向司机发开车信号,司机接到开车信号后才能启动车辆.在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门,让乘客上下车.因此司机启动车辆的动作必须与售票员的动作取得同步;售票员开车门的动作也必须同司机停车取得同步.

    第二步:确定信号量及其值.由于司机与售票员之间要互通消息,司机进程设置一个私有信号量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;