zoukankan      html  css  js  c++  java
  • [多线程同步练习]PV操作

    看一个较为复杂的生产者-消费者问题:

    问题描述

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

    问题分析

    1) 关系分析。这里的关系稍复杂一些,首先由每次只能向其中放入一只水果可知爸爸和妈妈是互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来,儿子和女儿之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发,如图2-8所示。

    2) 整理思路。这里有4个进程,实际上可以抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上。

    3) 信号量设置。首先设置信号量plate为互斥信号量,表示是否允许向盘子放入水果,初值为1,表示允许放入,且只允许放入一个。信号量 apple表示盘子中是否有苹果,初值为0,表示盘子为空,不许取,若apple=l可以取。信号量orange表示盘子中是否有橘子,初值为0,表示盘子为空,不许取,若orange=l可以取。解决该问题的代码如下:

    semaphore plate=l, apple=0, orange=0;
    dad() 
    {  //父亲进程
        while (1) 
    	{
            prepare an apple;
            P(plate) ;  //互斥向盘中取、放水果
            put the apple on the plate;  //向盘中放苹果
            V(apple);  //允许取苹果
        }
    }
    mom() 
    {  // 母亲进程
        while(1) 
    	{
            prepare an orange;
            P(plate);  //互斥向盘中取、放水果
            put the orange on the plate;  //向盘中放橘子
            V(orange); //允许取橘子
        }
    }
    son()
    {  //儿子进程
        while(1)
    	{
            P(orange) ;  //互斥向盘中取橘子
            take an orange from the plate;
            V(plate);  //允许向盘中取、放水果
            eat the orange;
        }
    }
    daughter () 
    {  //女儿进程
        while(1) 
    	{
            P(apple);  // 互斥向盘中取苹果
            take an apple from the plate;
            V(plate);  //运行向盘中取、放水果
            eat the apple;
        }
    }
    

    注意:这里的盘子就一个,只能放下一个水果,也就是说缓冲区的大小为1,所以mom和son连续执行,dad和daughter连续执行。

    那么如果,plate能放n个水果,又该怎么同步呢?

    待续...

  • 相关阅读:
    uva 1374 快速幂计算
    uva 1343 非原创
    uva 11212
    uva 10603
    路径寻找问题……!
    bzoj 1008: [HNOI2008]越狱
    bzoj 1010: [HNOI2008]玩具装箱toy
    dp斜率优化小计
    bzoj 1002[FJOI2007]轮状病毒
    hihocoder #1114
  • 原文地址:https://www.cnblogs.com/stemon/p/4859099.html
Copyright © 2011-2022 走看看