问题描述
三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区,P1每次用produce()生成一个正整数并用put()送入缓冲区某一个单元;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数,并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动。并说明所定义的信号量的含义(要求用伪代码描述)。
问题分析
这个问题就是基本的生产者和消费者问题的简单变化。在生产者和消费者问题中我们设置了empty和full信号量来满足空的缓冲区消费者不可以消费和满的缓冲区生产者不可以生产的这样的条件,在这个问题中,empty依旧保留让P1进程在缓冲区满的时候停止生产,用even和odd来让P2和P3进程在缓冲区空或者偶数为空或者奇数为空的时候停止消费(full信号量变成了even和odd两个信号量)
代码
semaphore mutex = 1; //缓冲区操作互斥信号量
semaphore even = 1; //偶数进程的同步信号量
semaphore odd = 1; //奇数进程的同步信号量
semaphore empty = N; //缓冲区的个数
p1(){
while(true){
x = produce();
P(empty);
P(mutex);
put();
V(mutex);
if(x%2 == 0){
//如果产生的是偶数,则可以唤醒偶数进程
V(even);
}
else{
否则可以唤醒奇数进程
v(odd);
}
}
}
P2(){
while(true){
P(odd);
P(mutex);
getodd();
V(mutex);
V(empty);
countodd();
}
}
P3(){
while(true){
P(even);
P(mutex);
geteven();
V(mutex);
V(empty);
counteven();
}
}