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 两个变量。然而,根据我的说法,只有一个变量可以做同样的事情,那就是价值。

4

2 回答 2

0

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

以下是一些附加信息,作为对您评论的回答。(我对你的评论对于评论部分来说太长了。)

您的一个变量解决方案不起作用的原因是,当您执行 value.get() 来读取寄存器时,您无法判断您获得的值是否是正确的值。由于它是对安全寄存器的读取,因此您可以获得任何值。您无法判断是否该写入寄存器,因为读取的值不一定正确。

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

在这种情况下,由于您要写入的值等于 get() 返回的值,因此您不会做任何事情。当您真正希望它为 1 时,这会使寄存器的值保持为 0。

于 2014-03-07T07:22:42.663 回答
0

好吧,一般来说,写线程是独立的线程(不是来自读者的线程),所以你根本无法通过写线程从 MRSW 安全布尔寄存器中读取,因为该寄存器不保存写者的值,它只能写入寄存器。这就是为什么您实际上需要第二个简单变量来保存先前写入的值。而已。

于 2020-04-21T22:54:33.477 回答