问题 问答题

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produee( )生成一个正整数并用put( )送入缓冲区某一空单元中;
P2每次用getodd( )从该缓冲区中取出一个奇数并用countodd( )统计奇数个数;
P3每次用geteven( )从该缓冲区中取出一个偶数并用eounteven( )统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。

答案

参考答案:定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。程序如下:
semaphore s1=0,s2=0,
mpty=N,mutex=1;
P1( )
{ X=produce( );//生成一个数}
P(empty);//判断缓冲区是否有空单元
P(mutex);//缓冲区是否被占用
Put( );
if(x%2==0)//如果是偶数,向P3发出信号
V(s2);
else //如果是奇数,向P2发出信号
V(s1);
V(mutex);//使用完缓冲区,释放
P2( )
{
P(s1);//收到P1发来的信号,已产生一个奇数
P(mutex);//缓冲区是否被占用
getodd( );
countodd( )=COUntodd( )+1;
V(mutex); //释放缓冲区
V(empty); //向P1发信号,多出一个空单元
P3( )
{
P(s2);//收到P1发来的信号,已产生一个偶数
P(mutex);//缓冲区是否被占用
geteven( );
counteven( )=counteven( )+1;

单项选择题
单项选择题