原子获取并设置x,y指令无条件地将内存位置x设置为1,并获取y中x的旧值,而无需任何中间访问内存位置x。考虑在二进制信号量上P和V函数的以下实现。
void P (binary_semaphore *s) {
unsigned y;
unsigned *x = &(s->value);
do {
fetch-and-set x, y;
} while (y);
}
void V (binary_semaphore *s) {
S->value = 0;
}
以下哪一项是正确的?
(A)如果在P中禁用了上下文切换,则该实现可能不起作用。
(B)可以使用一对正常的加载/存储来代替使用获取并设置
(三)执行V是错误的
(D)代码未实现二进制信号量答案: (A)
说明:让我们谈谈操作P()。它将s的值存储在x中,然后获取x的旧值,将其存储在y中并将x设置为1。如果某个其他进程不执行V()并设置,则该进程的while循环将永远继续。 s的值为0。如果在P中禁用了上下文切换,则while循环将永远运行,因为其他进程将无法执行V()。