请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。 15
三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd...
三个进程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。
semaphore
mutex=1;
//
缓冲区互斥信号量
semaphore
odd=0, even=0 //
奇数、偶数进程的同步信号量
semaphore
empty=N //
空缓冲区单元个数信号量
main( )
cobegin{
process P1
while(true){
number=produce();
p(empty); //
递减空缓冲区的单元个数
p(mutex); //
互斥访问缓冲区
put(
);
v(mutex); //
恢复访问缓冲区
if number%2==0 v(even); //
为偶数允许取偶数
else v(odd); //
为奇数允许取奇数
}
process P2
process P3
while(true){
while(true){
p(odd); //
互斥奇数
p(even);
p(mutex); //
互斥访问缓冲区
p(mutex);
getodd(
);
getevend(
);
v(mutex); //
恢复访问缓冲区
v(mutex);
v(empty); //
递增空缓冲区的单元个数
v(empty);
countodd(); }
counteven();}
}
coend
mutex
P1、P2
因为奇数的设置与取用而同步,设同步信号量odd
P1、P3因为偶数的设置与取用而同步,设同步信号量even;
P1、P2、P3因为共享缓冲区,设同步信号量empty。
semaphore
mutex=1;
//
缓冲区互斥信号量
semaphore
odd=0, even=0 //
奇数、偶数进程的同步信号量
semaphore
empty=N //
空缓冲区单元个数信号量
main( )
cobegin{
process P1
while(true){
number=produce();
p(empty); //
递减空缓冲区的单元个数
p(mutex); //
互斥访问缓冲区
put(
);
v(mutex); //
恢复访问缓冲区
if number%2==0 v(even); //
为偶数允许取偶数
else v(odd); //
为奇数允许取奇数
}
process P2
process P3
while(true){
while(true){
p(odd); //
互斥奇数
p(even);
p(mutex); //
互斥访问缓冲区
p(mutex);
getodd(
);
getevend(
);
v(mutex); //
恢复访问缓冲区
v(mutex);
v(empty); //
递增空缓冲区的单元个数
v(empty);
countodd(); }
counteven();}
}
coend
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询