2014-03-07 66 views
0
public class RegBoolMRSWRegister implements Register<Boolean> 
    private boolean old; 
    private SafeBoolMRSWRegister value; 
    public void write(boolean x) { 
      if (old != x) { 
       value.write(x); 
       old = x ; 
          } 
    } 

    public boolean read() { return value.read(); } 
} 

在上面的代码中使用了两个变量old和value。然而,根据我的观点,只能用一个变量来做同样的事情,那就是价值。为什么建立普通布尔MRSW寄存器需要2个寄存器?

回答

0

为了理解这一点,您需要了解安全和常规寄存器之间的区别。带有read()并发write()的安全寄存器可以返回任何值。常规寄存器只能返回先前的值或正在写入的值。如果我们没有检查,那么我们可以写一个值为1的寄存器,其中以前的值为1。由于基础寄存器是安全的,它的read()允许返回任何值。它可以返回0.但是,对于常规寄存器来说,0是不可接受的,因为它既不是先前的值,也不是正在写入的值。只有在更改寄存器时写入才能将您限制为其他二进制值或新值。 (由于这是一个二进制寄存器,因此只有2个可能的值)。

下面是一些额外的信息,作为您评论的答案。 (我对您的评论对于评论部分来说太长了。)

您的一个变量解决方案不起作用的原因是,当您执行value.get()来读取寄存器时,您无法分辨如果你得到的价值是正确的价值或不。既然它是一个安全寄存器的读取,你可能会得到任何价值。您不能分辨是否应该写入寄存器,因为读取值不一定正确。

下面是具体的例子: 寄存器值= 0 你想写= 1个 get()返回= 1

在这种情况下,由于要写入的值等于值的get( )返回,你不会做任何事情。这使得寄存器的值为0,当你真的想要它为1.

+0

感谢您的回复。是的,这一部分是了解。但考虑到这一部分,我们也可以用1个变量值做同样的事情。说 if(x!= value.get())value.write(x); 我的问题基本上是这样的实现中的问题。 –

+0

我更新了我的答案和其他一些信息。 –