1.问题描述
2.问题分析
同步问题:
(1)包含N个缓冲区单元,有空位置时才能写,即P1、P2、P3共享缓冲区空位,设置同步信号量empty;
(2)存在奇数时才能读出奇数,P1、P2共享奇数缓冲区,设置同步信号量odd;
(3)存在偶数时才能读出偶数,P1、P3共享偶数缓冲区,设置同步信号量even。
互斥问题:
三个进程彼此之间互斥的访问缓冲区,设置互斥信号量mutex。
3.注意事项
1.不要误认为是读者-写者问题,注意这里P2、P3之间也是互斥的,而读者之间的访问可以同时,这里只是单生产者多消费者问题;
2.对缓冲区的互斥访问使用mutex变量对三个进程进行约束即可,不需要在P2、P3之间单独添加约束变量。
4.伪代码实现
Shared Data:
semaphore mutex=1;//互斥访问共享缓冲区;
semaphore empty=N;//共享缓冲区同步信号量
semaphore odd=0;//奇数缓冲区同步信号量
semaphore even=0;//偶数缓冲区同步信号量
The P1 Process
do{
int num=produce();//生产一个数据num
wait(empty);//消耗掉一个空单元
wait(mutex);//互斥访问缓冲区;
put(num);//将数据num放入缓冲区
signal(mutex);
if(num%2!=0)//奇数
signal(odd);
else//偶数
signal(even);
}while(true);
The P2 Process
do{
wait(odd);//有奇数时才能取出奇数
wait(mutex);//互斥访问缓冲区
getodd();//取出奇数
signal(mutex);
signal(empty);//产生一个空单元
countodd();//奇数个数加一
}while(true);
The P3 Process
do{
wait(even);//有偶数时才能取出偶数
wait(mutex);
geteven();
signal(mutex);
signal(empty);
counteven();
}while(true);
5.问题参考
https://blog.csdn.net/weixin_45385429/article/details/115255883
https://blog.csdn.net/qq_39328436/article/details/109956241
https://blog.csdn.net/qq_38900441/article/details/83350728