经典同步问题(1)——生产消费者问题

本文探讨了经典同步问题——生产者消费者问题。首先分析了执行P操作时的正确顺序,指出mutex、empty、mutex、full的顺序能避免死锁。接着介绍了多生产者-多消费者问题,以家庭成员角色举例,阐述了如何确保资源的同步访问,确保只有当盘子中有对应水果时,家庭成员才能进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、生产者-消费者问题

semaphore mutex=1;
semaphore empty=n;
semaphore full=0;
producer()
{
    while(1)
    {
        produce an item in nextp;
        P(empty);
        P(mutex);
        add nextp in buffer;
        V(full);
        V(mutex);
    }
}
consumer()
{
    while(1)
    {
        P(full);
        P(mutex);
        remove an item form buffer;
        V(empty);
        V(mutex);
        consum an item;
    }
}

对生产者消费者问题指向P操作的时候,如果执行顺序是mutex,empty,mutex,full,那么会导致什么问题呢,生产者先封锁mutex,然后empty为n,那么消费者封锁mutex,但是此时mutex被生产者封锁,这样导致了生产者和消费者都处在等待被唤醒的状态,造成死锁。所以P操作,一定是按照empty,mutex,full,mutex的顺序执行,释放V操作无论先后顺序。

二、多生产者-多消费者问题

桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈就可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。

思路:dad()  daughter()  mom()  son()  按照这样的顺序执行

semaphore plate=1,apple=0,orange=0;
dad()//apple
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值