第 45 题
[tag_link]
有 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)操作,以实现上述过程的同步。要求写出完整的过程,并说明信号量的含义和初值。
semaphore A_full = x; // A 信箱中已有的邮件个数
semaphore A_empty = M - x; // A 信箱还可以放多少个邮件
semaphore B_full = y; // B 信箱中已有的邮件个数
semaphore B_empty = N - y; // B 信箱中还能放多少个邮件
semaphore A_mutex = 1; // 互斥访问 A 信箱
semaphore B_mutex = 1; // 互斥访问 B 信箱
A() {
while (1) {
P(A_full);
P(A_mutex);
从A信箱中取出一个邮件;
V(A_mutex);
V(A_empty);
回答问题并提出新问题;
P(B_empty);
P(B_mutex);
将信件放入B邮箱;
V(B_mutex);
V(B_full);
}
}
B() {
while (1) {
P(B_full);
P(B_mutex);
从B信箱中取出一个邮件;
V(B_mutex);
V(B_empty);
回答问题并提出新问题;
P(A_empty);
P(A_mutex);
将信件放入A邮箱;
V(A_mutex);
V(A_full);
}
}
【评分说明】
1)每对信号量的定义及初值正确,给分。
2)每个互斥信号量的 P、V 操作使用正确,各给分。
3)每个同步信号量的 P、V 操作使用正确,各给分。
4)其他答案酌情给分。