观察结果:首先生产者不停生产产品到10个,然后生产者一边生产、消费者一边消费,因为生产者的生产的速度比消费者消费的速度要快,所以产品还是在逐渐地累加一直到20,之后就是生产者生产一件产品、消费者消费一件产品,达到一个比较平衡的状态。
(2)一个生产者、一个消费者、公用n个环形缓冲区
这里比较特别的是缓冲池被分为多个环形缓冲区,也就是说,如果第一个缓冲区满了,那么生产者生产的产品只能放在第二个缓冲区中,如果第n个缓冲区满了,那么生产者就要再从第一个缓冲区开始放,消费者也是一样,如果第一个缓冲区里有产品而第二个里面没有,那么消费者就只能从第一个缓冲区中拿产品。因为缓冲区是环形的,要确定当前缓冲区是哪一个,我们可以用模运算求得。程序如下:
#include<toyix.h>
semaphore s,empty,full;
int product[10]={0};
producer()
{
int in=0;
while(1)
{
delay(20);
p(&empty);
p(&s);
printf("Producer: There are %d products in NO.%d buffer\n",++product[in],in);
in=(in+1)%10;
v(&s);
v(&full);
}
}
consumer()
{
int out=0;
while(1)
{
delay(400);
p(&full);
p(&s);
printf("Consumer: There are %d products in NO.%d buffer\n",--product[out],out);
out=(out+1)%10;
v(&s);
v(&empty);
}
}
main()
{
set(&s,1);
set(&empty,20);
set(&full,0);
cobegin(producer,consumer,0);
getch();
}
(3)一组生产者、一组消费者,公用n个环形缓冲区
因为有多个生产者和多个消费者,生产者之间存在互斥关系,消费者之间也存在互斥关系。所以我们要用信号量来控制一个时间只能有一个生产者在生产,一个消费者在消费。所以我们设mutex1为生产者之间的互斥信号量,初值为1,mutex2为消费者之间的互斥信号量,初值为2.,
程序如下:
#include<toyix.h>
semaphore s,empty,full,mutex1,mutex2;
int product[10]={0};
producer()
{
int in=0;
while(1)
{
delay(20);
p(&empty);
p(&mutex1);
p(&s);
printf("Producer: There are %d products in NO.%d buffer\n",++product[in],in);
in=(in+1)%10;
v(&s);
v(&mutex1);
v(&full);
}
}
consumer()
{
int out=0;
while(1)
{
delay(400);
p(&full);
p(&mutex2);
p(&s);
printf("Consumer: There are %d products in NO.%d buffer\n",--product[out],out);
out=(out+1)%10;
v(&s);
v(&mutex2);
v(&empty);
}
}
main()
{
set(&s,1);
set(&empty,20);
set(&full,0);
set(&mutex1,1);
set(&mutex2,1);
cobegin(producer,consumer,0);