【问题标题】:Atomic Register Read Operation Return Value原子寄存器读取操作返回值
【发布时间】:2015-01-21 16:57:43
【问题描述】:

我想知道这些选项中哪些是正确的。

一个原子寄存器 R 最初保存值 33 由两个进程 P 和 Q 使用,它们执行 以下并发操作:P 在时间间隔 [2,6] 期间执行 write(R,68) 并且 Q 执行 在时间间隔 [4,7] 期间读取(R)(操作在时间上重叠)。在这种情况下,由于 register 提供原子语义,保证:

(A) 读操作总是返回值 68。

(B) 读操作总是返回值 33。

(C) 读取操作可以返回值 33 或值 68。

(D) 什么都不能保证,因为操作是并发的。

我知道原子寄存器确保

如果 Ri → Rj 则 i j(如果 i 在 j 之前)

【问题讨论】:

标签: concurrency atomic


【解决方案1】:

在并发读取和写入期间,读取可以返回旧值或新值。为了维护一个原子寄存器的属性,在写的过程中,有一个时间点:

  • 在此之前总是返回 33,并且
  • 之后总是返回 68。

因此,选项(C)是正确的。

【讨论】:

    【解决方案2】:

    您可以在此处阅读说明: What's the difference between safe, regular and atomic registers?

    值得注意的信息是

    在该点之前执行操作的读取器都将读取旧值,而在该点之后执行操作的读取器将全部读取新值

    所以根据定义,由于读取发生在写入完成之前,它应该总是看到33。如果它是一个常规寄存器,它可能会在两者之间闪烁。

    【讨论】:

    • 从常规寄存器的定义:如果来自同一个线程的两次读取重叠了一次写入,那么如果前面的读取返回新值,则后面的读取不能返回旧值。所以在这个问题中只有一次读取,我们并不关心这个寄存器是常规的还是原子的。在这种情况下,它的行为是正常的 - 可以是两个值中的任何一个。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多