PV操作每日一题-橘子苹果问题(进阶版)

337 阅读1分钟

橘子苹果问题🍊🍎-进阶版


继续继续,昨天落下了一天,补上!今天的缓冲区大小没有限制,要注意啦!

一、问题描述

桌上有一个盘子,可以放入N个水果,每次只能放入一个水果,爸爸专门向盘子放入苹果,妈妈专门向盘子放入橘子;有一儿一女,儿子每次拿一个橘子吃,女儿每次拿一个苹果吃。请使用信号量和PV操作求解该问题。


二、问题求解

🔑:

semaphore empty=n;		//这可能是个巨大的盘子⑧
semaphore mutex=1;
int appleCount=0;
int orangeCount=0;

Father(){
    while(1){
        P(empty);
        P(mutex);       //互斥的P操作一定要在同步的P操作之后
        放一个橘子;
        V(mutex);
        V(appleCount);  //这里的两个P操作前后顺序无要求
    }
}

Mother(){
    while(1){
        P(empty);
        P(mutex);
        放一个苹果;
        V(mutex);
        V(orangeCount);
    }
}

Son()
{
    while(1)
    {
        P(orangeCount);
        P(mutex);
        拿一个橘子;
        V(mutex);
        V(empty);
    }
}

Daughter()
{
        while(1)
    {
        P(appleCount);
        P(mutex);
        拿一个苹果;
        V(mutex);
        V(empty);
    }
}

三、体会

看完这个题之后我们可以更好理解缓冲区的大小对互斥信号量的选择。

📋好啦,今天结束,后面还会有高阶版的橘子和苹果问题~
溜了,要淦论文去啦~