zoukankan      html  css  js  c++  java
  • 生产者-消费者问题

    问题描述:有一群生产者进程在不断生产产品,而另一群消费者进程在不断消费生产出的产品;为了了解生产和消费速度不匹配的矛盾,在生产者和消费者进程之间设置了一个具有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

    概念图:

  • 相关阅读:
    restfulframework详解
    restful规范
    02-模板字符串
    01-学习vue前的准备工作
    vue系列
    crawler_编码转换_unicode(年)
    002-算法-递归法
    001-算法-递推法
    000-算法-基础概念
    linux_后台启动多个java -jar 程序,及关闭
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/4209384.html
Copyright © 2011-2022 走看看