分析:公交车司机和售票员的关系是,司机停车→售票员开门;售票员关门→司机开车。 说明两者的动作是具有前驱关系的,一般有前驱关系,对后面的对象设置信号量,即设置mutex1和mutex2分别表示是否允许司机启动车辆和是否允许售票员开门
Semaphore mutex1=0; //是否允许司机启动汽车
Semaphore mutex2=0; //是否允许售票员开门
main()
{
cobegin
driver();
busman();
coend
}
driver()
{
while(TRUE)
{
p(mutex1);
启动公交车,开车,到站停车;
V(mutex2);
}
}
busman()
{
while(TRUE)
{
关车门
V(mutex1);
售票;
P(mutex2);
开车门,上下乘客
}
}
Q2.桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用PV操作实现四人正确活动的程序。
分析:只有一个盘子,爸爸妈妈放水果,儿子女儿吃水果,由题意可以看出儿子吃妈妈放的水果,女儿吃爸爸放的水果。可以理解爸妈抢盘子,抢到之后儿子女儿吃水果就是后继事件。即需要三个信号量,互斥信号量控制盘子,女儿是爸爸的后继事件发生者,需要设置,儿子同理,共需要三个信号量。
struct semaphore mutex = 1,daughter=0,son=0;
void father()
{
while(TRUE)
{
have an apple;
P(mutex); //父母争夺盘子
put an apple;
V(daughter); //提供女儿可以吃水果的条件
}
}
void mother()
{
while(TRUE)
{
have an orange;
P(mutex); //父母争夺盘子
put an orange;
V(son); //提供儿子可以吃水果的条件
}
}
void daughter()
{
while(TURE)
{
P(daughter); //女儿吃水果,使用掉‘机会’
get an apple;
V(mutex);
eat an apple;
}
}
void son()
{
while(TURE)
{
P(son); //女儿吃水果,使用掉‘机会’
get an orange;
V(mutex);
eat an orange;
}
}
Q3.现在有两个进程,进程1包含A、E、F三个线程,进程2包含B、C、D三个线程,线程C需要在A、B完成之后才能运行,线程D、E需要在线程C之后进行,F需要在E线程之后,请问两个进程怎么实现同步?
分析:由题意介绍,可以看出AEF和BCD本身就是具有一个前后关系,并不涉及进程同步问题。画出关系图可以看出A与C之间有前驱关系,C与E之间有前驱关系,故可以设置两个信号量
semaphore SAC,sCE;
P1()
{
A;
V(SAC); //执行完A之后可以给C执行提供条件,所以进行V操作
P(SCE); //进程1中下一步需要执行E,但是不知道C是否已经执行,需要进行P操作,申请一下是否可执行
E;
F;
}
P2()
{
B;
P(SAC); //需要访问一下,看一下其前驱是否执行完毕
C;
V(SCE); //C已经执行完毕,现在给与E执行条件
D;
}