• 生产者-消费者问题


    问题描述:有一群生产者进程在不断生产产品,而另一群消费者进程在不断消费生产出的产品;为了了解生产和消费速度不匹配的矛盾,在生产者和消费者进程之间设置了一个具有n个缓冲区的缓冲池;生产者进程不断将它生产出的产品投放到缓冲区中,每次投放的产品占满一个缓冲区,消费者进程不断冲缓冲区中取走产品去消费,一次取出一个缓冲区的产品;尽管生产者进程和消费者进程以异步方式运行,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲池中取产品,但不允许生产者进程将产品投放到一个已装满产品的缓冲池。
    用一个具有n个消费元素的环状数组来模拟池,每个数组元素模拟一个缓冲区。缓冲池是临界资源,每个进程必须以互斥方式使用缓冲区。
    某一个中解决方法时:设置3个信号量mutex、empty、full;mutex是互斥信号量,初值为1,用来实现诸进程以互斥方式使用缓冲区;empty是资源信号量(即表示某种资源当前可用的数量),用来表示缓冲池中当前空缓冲区的数量,其初值为n;full也是资源信号量,用来表示缓冲池中当前满缓冲区的数量,其初值为0.生产者-消费者问题的解决方案描述如下:

    item B[n];
    semaphore mutex,empty,full;
    mutex.value=1;empty.value=n;full.value=0;
    int in=0;
    int out=0;
    item product;
    
    cdbegin    //里面的进程可以并发执行
    process producer_i()
    {
        while(1)
        {
            product=produce();//生产产品
            P(empty);
            P(mutex);
            B[in]=product;
            in=(in+1)%n;
            V(mutex);
            V(full);
        }
    }
    process consumer_i()
    {
        while(1)
        {
            P(full);
            P(mutex);
            product=B[out];
            out=(out+1)%n;
            V(mutex);
            V(empty);
            consume();//消费产品
        }
    }
    
    coend

    概念图:

  • 相关阅读:
    36、基于TCP、UDP协议的嵌套字通信
    34、异常以及网络编程
    作业4月15号
    31、反射与内置方法、元类
    30、多态与鸭子类型以及内置函数
    作业4月9号
    29、继承
    作业4月8号
    28、封装
    27、面向对象
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/4209384.html
Copyright © 2020-2023  润新知