生产者消费者问题
典型的合作制约关系的进程同步问题。描述是:
生产者与消费者具有一个公共缓冲池,该缓冲池包含n个缓冲区。每个缓冲区中可以存放一个数据(每个缓冲区只有两种状态:有数据便为满状态,无数据便为空状态)。只要缓冲池中存在空缓冲区,生产者就可将数据写入缓冲池,一旦缓冲池全满,生产者就要停止生产;只要缓冲池中存在满缓冲区,消费者就可从缓冲池中取走一条数据,一旦缓冲池全空,消费者就要停止消费。
方法一:记录型信号量
int buffer[n];//缓存,临界资源
semaphore full = 0;//full代表产品个数,semaphore 信号量
semaphore empty = n; //代表空位
semaphore mutex;
//生产者
void producer(){
int i = 0;
while(true){
P(empty);//如果有空位就生产,没有就阻塞
P(mutex); // 如果没有阻塞的话,就进入临界资源
buffer[i] = nextp;//生产
i = (i + 1) % n;
P(mutex);//离开临界区
P(full);//产品数加1
}
}
//消费者
void consumer(){
int i = 0;
while(true){
P(full);//如果有产品就生产,没有就消费
P(mutex); // 如果没有阻塞的话,就进入临界资源
nextc = buffer[i] ;//生产
i = (i + 1) % n;
P(mutex);//离开临界区
P(empty);//空位数加1
}
}
方法二:AND型信号量
int buffer[n];//缓存,临界资源
semaphore full = 0;//full代表产品个数,semaphore 信号量
semaphore empty = n; //代表空位
semaphore mutex;
//生产者
void producer(){
int i = 0;
while(true){
Swait(empty,mutex);
buffer[i] = nextp;//生产
i = (i + 1) % n;
Ssignal(mutex,full);
}
}
//消费者
void consumer(){
int i = 0;
while(true){
Swait(full,mutex);
nextc = buffer[i] ;//生产
i = (i + 1) % n;
Ssinal(mutex);
}
}