生产者只有在获得了一个空的缓冲区的时候,才可以进行写入操作,消费者只有获得一个满的缓冲区(也就是有内容的缓冲区)的时候,才可以进行取出其中内容的操作,同时,在生产者进行写入操作的时候消费者不可以进行读取操作,而当消费者进行读取操作的时候,生产者不可以进行写入操作,所以,生产者和消费者对于缓冲区的访问是互斥关系,而生产者和消费者又是一个同步的关系,只有生产者生产,消费者才可以在缓冲区中进行读取。
(注:同步和互斥是两种关系,同步指的是生产者和消费者之间的存取是同步关系,而互斥是指生产者和消费者对于缓冲区的操作是互斥对立的操作,一次只可以对于缓冲区进行一种操作)
编写生产者和消费者进程的执行过程:
有三个控制的量:空的缓冲区、满的缓冲区以及互斥信号量metux;
-
semaphore mutex=1; //临界区互斥信号量
-
semaphore empty=n; //空闲缓冲区
-
semaphore full=0; //缓冲区初始化为空
-
producer () { //生产者进程
-
while(1){
-
produce an item in nextp; //生产数据
-
wait(empty); //获取空缓冲区单元
-
wait(mutex); //进入临界区.
-
add nextp to buffer; //将数据放入缓冲区
-
signal(mutex); //离开临界区,释放互斥信号量
-
signal(full); //满缓冲区数加1
-
}
-
}
-
-
consumer () { //消费者进程
-
while(1){
-
wait(full); //获取满缓冲区单元
-
wait(mutex); // 进入临界区
-
remove an item from buffer; //从缓冲区中取出数据
-
signal (mutex); //离开临界区,释放互斥信号量
-
signal (empty) ; //空缓冲区数加1
-
consume the item; //消费数据
-
}
-
}
其中,metux在生产者和消费者任何之一对于其置为0时,另一个进程对于其访问时则会阻塞。