3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 getodd() 从该缓冲区中取出一个奇数,并用 countodd() 统计奇数的个数 ;P3 每次用geteven() 从该缓冲区中取出一个偶数,并用 counteven() 统计偶数的个数。请用信号量机制实现这 3 个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。
// 互斥信号量
mutex = 1;
// 共享内存中的偶数个数
even = 0;
// 奇数个数
odd = 0;
// 共享内存的剩余空间
empty = n;
p1(){
while(true){
p(empty);//等待有空位置
num = produce();//生成正数
p(mutex);//互斥
put(num);//放入缓冲区
v(mutex);//释放
v(empty);//n中添加一个元素
if(num % 2 == 0){
v(even);//偶数增加
}else{
v(odd);//奇数增加
}
}
}
p2(){
while(true){
p(odd);//等待一个奇数
p(mutex);//互斥
getodd();//取出奇数
countodd();//统计奇数个数
v(mutes);//释放
v(odd);//奇数个数减少
}
}
p3(){
while(true){
p(event);//等待一个偶数
p(mutex);//互斥
geteven();//取出偶数
counteven();//统计偶数个数
v(mutes);//释放
v(event);//偶数个数减少
}
}