三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用getev

admin2015-12-30  33

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

选项

答案互斥资源:缓冲区只能互斥访问,因此设置互斥信号量mutex。 同步问题:P1、P2因为奇数的放置与取用而同步,设同步信号量odd;P1、P3因为偶数的放置与取用而同步,设置同步信号量even;P1、P2、P3因为共享缓冲区,设同步信号量empty,初值为N。 程序如下: semaphore mutex=1; semaphore odd=0,even=0; semaphore empty=N; main() cobegin{ Process P1() while(True) { x=produce();//生成一个数 p(empty);//判断缓冲区是否有空单元 P(mutex);//缓冲区是否被占用 Put(); V(mutex);//释放缓冲区 if(x%2==0) v(even);//如果是偶数,向P3发出信号 else V(odd);//如果是奇数,向p2发出信号 } Process P2() while(True) { p(odd);//收到p1发来的信号,已产生一个奇数 p(mutex);//缓冲区是否被占甩 getodd(); V(mutex);//释放缓冲区 V(empty);//向p1发信号,多出一个空单元 countodd(); } Process P3() while(True) { p(even);//收到p1发来的信号,已产生一个偶数 p(mutext);//缓冲区是否被占用 geteven(); V(mutex);//释放缓冲区 V(empty);//向p1发信号,多出一个空单元 counteven(); } }coend

解析
转载请注明原文地址:https://kaotiyun.com/show/coRi777K
0

最新回复(0)