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

    概念图:

  • 相关阅读:
    golang学习笔记 ---接口
    golang学习笔记 --类与方法
    golang学习笔记--面向对象编程
    golang学习笔记---错误处理
    golang学习笔记---defer[延迟函数]
    golang学习笔记--闭包
    golang学习笔记---函数
    SSD技术扫盲之:什么是NVMe? NVMe SSD有什么特点?
    云原生存储系列文章:云原生应用的基石
    发财树的养殖方法
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/4209384.html
Copyright © 2011-2022 走看看