三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描述。
参考答案:定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。程序如下:
Var S1=0,S2=0,empty=N,mutex=1;
parbegin
p1:Begin
x=produce(); //生成一个数
p(empty); //判断缓冲区是否有空单元
P(mutex); //缓冲区是否被占用
Put();
if x%2=0
v(S2); //如果是偶数,向P3发出信号
else
V(S1); //如果是奇数,向P2发出信号
V(mutex); //使用完缓冲区,释放
End
p2:Begin
P(s1)); //收到P1发来的信号,已产生一个奇数
P(mutex); //缓冲区是否
Getodd();
Countodd():=countodd()+1;
V(mutex); //释放缓冲区
V(empty); //向P1发信号
End
P3:Begin
P(s2); //收到p1发来的信号,已产生一个偶数
P(mutex); //缓冲区是否被占用
Geteven();
Counteven():=COunteven()+1;
V(mutex); //释放缓冲区
V(empty) //向p1发信号,多出一个空单元
End
Parend