操作系统第七周[第四次作业]【王清江】
有A、B两人通过信箱进行辩论,每人都从自己的信箱中取得对方的问题。将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中,设A的信箱最多放M个邮件,B的信箱最多放 N个邮件。初始时A的信箱中有x个邮件(0<x<M) ,B信箱中有y个(0<y<N)。辩论者每取出一个邮件,邮件数减1。
A、B两人操作过程:
A()
{
While(TRUE){
从A的信箱中取出一个邮件;
回答问题并提出一个新问题;
将新邮件放入B的信箱;
}
}
B( ){
While(TRUE){
从B的信箱中取出一个邮件;
回答问题并提出一个新问题;
将新邮件放入A的信箱;
}
}
当信箱不为空时,辩论者才能从信箱中取邮件,否则等待。
当信箱不满时,辩论者才能将新邮件放入信箱,否则等待。
请添加必要的信号量和P、V(或wait, signed)操作,以实现上述过程的同步,要求写出完整过程,并说明信号量的含义和初值。
解【请换一个符号,不要命名一模一样】:
semaphore mutex_A=1; //A邮箱互斥访问
semaphore mutex_B=1; //B邮箱互斥访问
semaphore empty_A=M - x; //表示A邮箱空闲的可以放邮件的位置,大于零,小于M
semaphore empty_B=N - y; //表示B邮箱空闲的可以放邮件的位置,大于零,小于N
semaphore full_A=x; //表示A邮箱中剩余的邮件数量
semaphore full_B=y; //表示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);
}
}
void main(){ //主线程
cobegin
A();
B();
coend
}