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