semaphore mutex_A=1;//互斥访问A信箱
semaphore mutex_B=1;//互斥访问B信箱
semaphore empty_A=M-x;//A信箱中的空位
semaphore full_A=x;//A信箱中的信件数
semaphore empty_B=N-y;
semaphore full_B=x;//B信箱中的信件数
void A()
{
while(true)
{
p(full_A)
p(mutex_A)
从A的信箱中取出一个邮件
v(mutex_A)
v(empty_A)
回答问题竟提出新问题
p(empty_B)
p(mutex_B)
将邮件放入B的信箱中
v(mutex_B)
v(full_B)
}
}
void B()
{
while(true)
{
p(full_B)
p(mutex_B)
从B的信箱中取出一个邮件
v(mutex_B)
v(empty_B)
回答问题竟提出新问题
p(empty_A)
p(mutex_A)
将邮件放入A的信箱中
v(mutex_A)
v(full_A)
}
}
semaphore empty = N; //缓冲区的大小N
//semaphore full = 0; //no use
semaphore odd = 0; //取奇数进程的consumer和producer之间的同步信号量
semaphore even = 0; //取偶数进程的consumer和producer之间的同步信号量
semaphore mutex = 1;
P1(){
while(true){
p(empty);
num = produce();
p(mutex);
put();
v(mutex);
if(num%2 == 0)
v(even);
else
v(odd);
}
}
P2(){
while(1){
p(odd);
p(mutex);
getodd();
countodd();
v(mutex);
v(empty);
}
}
P3(){
while(1){
p(even);
p(mutex);
geteven();
counteven();
v(mutex);
v(empty);
}
}