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

【正确答案】Semaphore s1=0,s2=0,empty=N, mutex=1;
main()
{
cobegin
P1();P2();P3();
coend
}
P1()
{
x=produce();
P(empty);
P(mutex);
Put()
if(x% 2==0) V(s2);
else V(s1);
V(mutex);
}
P2()
{
P(s1)
P(mutex);
Getodd();
Countodd()=countodd()+1;
V(mutex);
V(empty);
}
P3()
{
P(s2)
P(mutex);
Geteven();
Counteven():=counteven()+1;
V(mutex);
V(empty);
【答案解析】[解析] 本题目考查进程的同步与互斥。本题目是苹果一橘子问题(例14)的变形。进程P1可以看做是生产者,进程P2和P3可看做是消费者,进程P1和P2、P3共享大小为N的缓冲区。进程P1、P2和P3需互斥使用缓冲区,P1进程需要与P2进程、P3进程同步。定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。