@Linux司机售票员示例
司机——售票员:
司机的动作流程分为开车、行驶、停车。
开车前必须要确保车门关闭好,故此要在开车动作前进行p操作直到售票员释放 【车门已关的信号】,司机线程在收到该信号量时p操作成功,结束阻塞状态,该线程继续运行。到停车动作完成时要释放【车已停好的信号】,售票员线程收到该信号量时结束阻塞状态,继续运行至完成打开车门动作。
void* driver()
{
while(1)
{
sem_wait(&semid1);//减少信号的值,相当于p操作 不能开门,上下车
printf("driver发车\n");
printf("driver行驶\n");
printf("driver停车\n");
sem_post(&semid2);//增加信号的值,相当于v操作 可以售票、关门
}
售票员——乘客:
售票员的动作流程分为开门、售票、关门。
乘客动作流程分为上车、下车。
售票员开门前必须确保车辆是停车状态,故在开车门动作前进行p操作,阻塞售票员进程直到司机释放【车辆停下信号量】,完成开门动作后,需要释放【车门已开的信号】,乘客线程此前一直处于阻塞状态(前面有p操作),收到【车门已开的信号】后便可以完成上车动作。售票员线程完成售票动作后乘客才能下车,故此售票员线程在完成售票后要释放一个【票已售】的信号,乘客在上车动作完成后一直处于阻塞状态,直到收到售票员【票已售】的信号后,乘客线程才能继续运行,完成下车动作。