假设我们要使用二进制信号量 S 和 T 同步两个并发进程 P 和 Q。进程 P 和 Q 的代码如下所示。
Process P:
while (1) {
W:
print '0';
print '0';
X:
}
Process Q:
while (1) {
Y:
print '1';
print '1';
Z:
}
只能在 W、X、Y 和 Z 点插入同步语句
以下哪项将确保输出字符串永远不会包含 01^n0 或 10^n1 形式的子字符串,其中 n 是奇数?
(A) W 处的 P(S),X 处的 V(S),Y 处的 P(T),Z、S 和 T 处的 V(T) 最初为 1
(B) W 处的 P(S),X 处的 V(T),Y 处的 P(T),Z、S 和 T 处的 V(S) 最初为 1
(C) W 处的 P(S),X 处的 V(S),Y 处的 P(S),Z 处的 V(S),S 最初为 1
(D) W 处的 V(S),X 处的 V(T),Y 处的 P(S),Z、S 和 T 处的 P(T) 最初为 1答案: (C)
说明: P(S) 表示等待信号量“S”,V(S) 表示信号量“S”上的信号。这些函数的定义是:
Wait(S) {
while (i <= 0) ;
S-- ;
}
Signal(S) {
S++ ;
}
最初 S = 1 和 T = 0 以支持进程“P”和“Q”中的互斥。由于 S = 1 ,进程 ‘P’ 将被执行并且函数Wait(S) 将减少 ‘S’ 的值。所以,现在 S = 0。同时,在进程 ‘Q’ 中, T = 0 。因此,进程中的“Q”控制将停留在while循环中,直到时间进程“P”打印“00”并通过调用函数V(T)增加“T”的值。当控制在进程 ‘Q’ 中时,S = 0 并且进程 ‘P’ 将卡在 while 循环中。进程 ‘P’ 将不会执行,直到时间进程 ‘Q’ 打印 ’11’ 并通过调用函数V(S) 使 S = 1。
因此,过程 ‘P’ 和 ‘Q’ 将不断重复以给出输出 ‘00110011 …… ‘ 。
观看 GeeksforGeeks 视频说明:
如果您发现上面的帖子有任何错误,请在下面发表评论。
这个问题的测验