2.14生产者消费者问题

视频链接:
https://www.bilibili.com/video/BV1YE411D7nH?p=22

一,问题描述:

1,系统中有一组生产者和消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用(这里的产品,可以理解为某种数据),生产者和消费者需要共享一个初始为空,大小为N的缓冲区。

2,只有缓冲区没满时,生产者才能把产品放入缓冲区中,如果缓冲区满了,就需要等待

3,只有缓冲区不为空时,消费者才能从缓冲区取出产品。缓冲区为空时等待,,缓冲区是临界资源必须互斥的访问

二,具体实现

1, 问题分析
缓冲区为空时,生产者进程要在消费者进程之前——进程同步1
缓冲区为满时,生产者进程要在消费者进程之之后——进程同步2
生产者进程和消费者进程需要对缓冲区进行互斥的访问——进程互斥

2,代码表示

semaphore mutex=1;   //互斥信号量,互斥的主体是多个生产者(消费者)进程之间,不是生产者和消费者之间的互斥
semaphore empty=n;   //同步信号量1,代表缓冲区为空的空间数,用来唤醒生产者进程,即缓冲区有空闲生产者进程可以生产
semaphore full=1;    //同步信号量2,代表缓冲区被占的空间数,用来唤醒消费者进程,即缓冲区有产品消费者进程就可以取走产品

/*
注意:先对实现同步的P操作,在实现互斥的P操作,这两个操作顺序不能交换
*/

//生产者进程
producter(){
    while(1){
        生成一个产品;
        p(empty);//同步的P操作,缓冲有空闲时,可以执行下去
        p(mutex);//互斥的P操作,多个生产者之间对缓冲区的访问要互斥进行。防止数据被覆盖
        把产品放入到缓冲区中;
        v(mutux);
        v(full);
    }
}

//消费者进程
consumer(){
    while(1){
        p(full);//同步的P操作,缓冲有产品时,可以执行下去
        p(mutex);//互斥的P操作,多个消费者进程需要互斥访问缓冲区,防止读空的现象
        从缓冲区中取出一个产品;
        v(mutux);
        v(empty);
        使用产品;
    }
}


三,解题思路:

1,关系分析。找出题目中描述的个进程,分析他们同步,互斥关系
2,整理思路,根据各个进程的操作流程确定P,V操作的大致顺序
3,设置信号量,设置需要的信号量,并根据题目条件确定信号量的初值
4,注意,进入临界区之前,先实现同步的P操作,再实现互斥的P操作

猜你喜欢

转载自blog.csdn.net/weixin_44841312/article/details/105290907