【问题分析】
同步问题:n个缓冲区单元,缓冲区有空位置时才能写;有奇数才能读出奇数,有偶数才能读出偶数
互斥问题:三个进程彼此互斥访问缓冲区
【坑】
不要误以为这是读者写者问题,读者写者问题是针对“共享文件”的访问,所以多个读者之间不存在互斥关系,但是这里是“缓冲区”,一次两个读者也只能互斥访问,这其实只是一个单生产者多消费者问题而已,对应教材中的“吸烟者问题”
【代码】
semaphore mutex=1;//互斥访问缓冲区;
semaphore empty=n;//缓冲区中有n个单元
semaphore odd=0;//记录奇数个数
semaphore even=0;//记录偶数个数
void p1(){
while(true){
int x=produce();//生产一个数据x
p(empty);//消耗掉一个空单元
p(mutex);//互斥访问缓冲区;
put(x);
v(mutex);
if(x%2==0)
v(even);
else
v(odd);
}
}
void p2(){
while(true){
p(odd);//有奇数才能取奇数出来
p(mutex);
getodd();
v(mutex);
v(empty);//产生一个空单元
countodd();
}
}
void p3(){
while(true){
p(even);
p(mutex);
geteven();
v(mutex);
v(empty);
counteven();
}
}