具有提取和设置功能的二进制信号量

时间:2016-08-09 02:49:35

标签: c process synchronization semaphore

我正在阅读我在以下问题中发现的博客:

  

原子提取和设置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'的值是多少?

0 个答案:

没有答案