问题 问答题

进程A、B、C坐在圆桌旁讨论问题(面朝圆桌),每个人都从其右边那个人的信箱里取得讨论的问题,回答完一个问题后提出一个新问题放在左边的信箱中。假设A右边的信箱可放3个问题,B右边的信箱可以放2个问题,C右边的信箱可以放3个问题,初始时A右边的信箱中有2个问题。用信号量写出3个人讨论问题的同步算法。

答案

参考答案:3个信箱分别需要2个信号量:信箱A为Sa、Wa,信箱B为Sb、Wb,信箱C为Sc、Wc,其中Sa、Sb和Sc的初始值都为1(信箱操作互斥用),Wa、Wb和Wc的初始值分别为1、2、3(表示剩余信箱容量)。
A算法为:
while (true) {
P(Sa);
从信息A取出一个问题;
V(Sa);
V(Wa); //信箱A容量加1
回答取出的问题;
提出新问题;
P(Wb); //等待信箱B的空间
P(Sb);
将新问题放入信箱B中;
V(Sb);
}
B算法为:
while (true) {
P(Sb);
从信箱B取出一个问题;
V(Sb);
V(Wb); //信箱B容量加1
回答取出的问题;
提出新问题;
P(Wc); //等待信箱B的空间
P(Sc);
将新问题放入信箱C中;
V(Sc);
}
C算法为:
while (true) {
P(Sc);
从信箱C取出一个问题;
V(Sc);
V(Wc); //信箱C容量加1
回答取出的问题;
提出新问题;
P(Wa); //等待信箱A的空间
P(Sa);
将新问题放入信箱A中;
V(Sa);

单项选择题
单项选择题