生产者-消费者问题

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

概念图:

posted @ 2015-01-07 20:38  keyboard3  阅读(1193)  评论(0编辑  收藏  举报