Bootstrap

3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 get

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);//偶数个数减少
    }
}
;