第 45 题
(7分)三个进程 P1、P2、P3 互斥使用一个包含 N( N>0)个单元的缓冲区。P1 每次用 produce( 生 成一个正整数并用 put() 送入缓冲区某一空单元中;P2 每次用getodd0 从该缓冲区中取出一个奇数并用 countodd( 统计奇数个数;P3 每次用geteven( 从该缓冲区中取出一个偶数并用 counteven( 统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描 述。
[tag_link]
[tag_link]
互斥资源:缓冲区只能互斥访问,因此设置互斥信号量 mutex。
同步问题: P 1 、 P 2 因为奇数的放置与取用而同步,设同步信号量 odd; P 1 、 P 3 因为偶数的放置与取用而同步,设置同步信号量 even; P 1 、 P 2 、 P 3 因为共享缓冲区,设同步信号量 empty, 初值为 N。程序如下:
semaphore mutex = 1;
semaphore odd = 0, even = 0;
semaphore empty = N;
//生产者:产生数字放入缓冲区
P1()
{
while (true)
{
x = produce();
P(empty); //申请空闲位置
P(mutex); //互斥访问缓冲区
put();
V(mutex);
if (x % 2 == 0)
V(even);
else
V(odd);
}
}
//奇数消费者
P2()
{
while (true)
{
P(odd);
P(mutex);
getodd();
V(mutex);
V(empty);
countodd();
}
}
//偶数消费者
P3()
{
while (true)
{
P(even);
P(mutex);
geteven();
V(mutex);
V(empty);
counteven();
}
}