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、signal)操作,以实现上述过程的同步。 要求写出完整过程,并说明信号量的含义和初值。
45 .解答:
semaphore Full_A = x; //Full_A 表示 A 的信箱中的邮件数量
semaphore Empty_A = M-x; // Empty_A 表示 A 的信箱中还可存放的邮件数量
semaphore Full_B = y; //Full_B 表示 B 的信箱中的邮件数量
semaphore Empty_B = N-y; // Empty_B 表示 B 的信箱中还可存放的邮件数量
semaphore mutex_A = 1; //mutex_A 用于 A 的信箱互斥
semaphore mutex_B = 1; //mutex_B 用于 B 的信箱互斥
Cobegin
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);
}
}
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);
}
}
【评分说明】
1 )每对信号量的定义及初值正确,给分。
2 )每个互斥信号量的 P 、 V 操作使用正确,各给分。
3 )每个同步信号量的 P 、 V 操作使用正确,各给分。
4 )其他答案酌情给分。