我正在阅读我在以下问题中发现的博客:
原子提取和设置x,y指令无条件地设置 内存位置x到1并且在没有的情况下获取x n y的旧值 允许任何干预访问内存位置x。考虑一下 在二进制信号量S上实现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)代替使用fetch-and -set,一对正常
可以使用加载/存储
(C)V的实施是错误的
(D)代码没有实现二进制信号量
答案是:A
我明白为什么选项B是错误的。
关于选项C,通过V(SIGNAL)的定义,它应该增加信号量的值,但在函数中它只是将信号量值更新为0.
P(WAIT)函数将信号量值更新为1但不应该减小该值。
对于选项D,我同意它是二进制信号量,但P& V函数实现被颠倒了。 (纠正我,如果我错了)
是P&程序中给出的V函数与Wait和Signal相同,或者它们只是随机函数名称?
Fetch and Set第一次运行时,'y'的值是多少?