基于toyix的进程和轻权进程的学习(8)

观察结果:首先生产者不停生产产品到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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/26974be0ecc82c69b54cff0f7be50720.html