Language agnostic 什么';安全寄存器、常规寄存器和原子寄存器之间的区别是什么?

Language agnostic 什么';安全寄存器、常规寄存器和原子寄存器之间的区别是什么?,language-agnostic,concurrency,terminology,atomic,Language Agnostic,Concurrency,Terminology,Atomic,有人能提供详尽的解释吗?我潜入并发编程,在试图理解共识的同时遇到了这些寄存器 :…如果两个连续的读操作重叠在同一个写操作上,无法获得新值,则常规寄存器是原子的 假设第一个线程是thread0。写入(0)——没有重叠。基本上,可以使用Lamports定义说,thread1可以先读取1,然后再读取0,如果两次读取都是后续的并且与thread0重叠。写入(1)。但这怎么可能呢?对共享内存位置的读取和写入需要有限的时间,因此它们可能重叠,也可能完全不同 e、 g 线程2的第一次读取与线程1的第一次写入重

有人能提供详尽的解释吗?我潜入并发编程,在试图理解共识的同时遇到了这些寄存器

:…如果两个连续的读操作重叠在同一个写操作上,无法获得新值,则常规寄存器是原子的


假设第一个线程是
thread0。写入(0)
——没有重叠。基本上,可以使用Lamports定义说,
thread1
可以先读取1,然后再读取0,如果两次读取都是后续的并且与
thread0重叠。写入(1)
。但这怎么可能呢?

对共享内存位置的读取和写入需要有限的时间,因此它们可能重叠,也可能完全不同

e、 g

线程2的第一次读取与线程1的第一次写入重叠,而第二次读取与第二次写入不重叠。在线程3中,两次读取与第一次写入重叠

安全的寄存器仅在读操作不与写操作重叠的情况下才是安全的。如果读操作不与任何写操作重叠,则必须读取最近一次写操作写入的值。否则,它可能返回寄存器可能持有的任何值。因此,在线程2中,第二次读取必须返回第二次写入写入的值,但第一次读取可以返回任何有效值

常规寄存器增加了额外的保证,即如果读操作与写操作重叠,则它将读取旧值或新值,但与写操作重叠的多个读操作不必就哪个值达成一致,并且该值可能会前后“闪烁”。这意味着从同一线程(如上面的线程3)进行的两次读操作(两者都与写操作重叠)可能会出现“无序”:较早的读操作返回新值,而较晚的读操作返回旧值

原子寄存器保证读写似乎发生在单个时间点。在该点之前的某个点采取行动的读者都将阅读旧值,在该点之后采取行动的读者都将阅读新值。特别是,如果来自同一线程的两次读取与一次写入重叠,则如果较早的读取返回新值,则较后的读取无法返回旧值。原子寄存器是可线性化的


Maurice Herlihy和Nir Shavit给出了一个很好的描述,以及示例和用例。

您应该了解多处理器编程的艺术:)@Anthony为什么常规寄存器被认为是静态一致的?如果有一个静态期间没有访问,那么所有后续读取都将读取相同的(一致的)原子寄存器中的值:当两次读取与写入操作重叠时,第一次读取可以返回旧值还是新值?
Thread 1:      wwwww     wwwww
Thread 2:   rrrrr              rrrrr
Thread 3:   rrrrr rrrrr