假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个数。进程R从输入设备读入一个数,把它存放到缓冲区B里。如果存入的是奇数,则由进程W1取出打印;如果存入的是偶数,则由进程W2取出打印。规定进程R只有在缓冲区B为空或内容已经被打印后才能进行存放;进程W1和W2不能从空缓冲区里取数,也不能重复打印。试用信号量及其P、V操作管理这3个进程,让它们能够协调地正确工作。
Semaphore empty,SW1,SW2; //先设置3个信号量
empty.value=1;SW1.value=0;SW2.value=0;
cobegin
process R()
{
int a;
while(1)
{
P(empty); //判断缓冲区B是否为空,并且让进程R进行存放
B=a; //把读入的变量a中的数赋值给缓冲区B
if(a%2==1) //判断奇偶数
V(SW1); //如果读入的是奇数,则向进程W1发出信号
else
V(SW2); //如果读入的是偶数,则向进程W2发出信号
}
}
process W1()
{
int b;
while(1)
{
P(SW1); //收到进程R发过来的信号,读入的数是一个奇数
b=B; //取出缓冲区B中的奇数到变量b中,使得缓冲区B为空
V(empty); //向进程R发出信号,使进程R又可以向缓冲区B读入一个整数
}
} //打印
process W2()
{
int c;
while(1)
{
P(SW2); //收到进程R发过来的信号,读入的数是一个偶数
c=B; //取出缓冲区B中的偶数到变量c中,使得缓冲区B为空
V(empty); //向进程R发出信号,使进程R又可以向缓冲区B读入一个整数
}
} //打印
coend