您的当前位置:首页正文

进程同步问题习题——前驱关系

2024-12-01 来源:个人技术集锦

进程同步问题习题——前驱关系

前驱关系

分析:公交车司机和售票员的关系是,司机停车→售票员开门;售票员关门→司机开车。 说明两者的动作是具有前驱关系的,一般有前驱关系,对后面的对象设置信号量,即设置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;
}
显示全文