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

    概念图:

  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/4209384.html
Copyright © 2011-2022 走看看