因果关系示例执行

时间:2016-03-24 13:51:53

标签: java multithreading memory concurrency

该链接提供了允许合法执行的示例。请参阅第26页第4.8.1节http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.79.629&rep=rep1&type=pdf

示例是

  devServer: {
      historyApiFallback: true
  }

来自论文,

  

我们希望采取行动   r2 = y   看到值1。   C   1   不能包含此操作   看到这个值:既没有写信给   ÿ   已经承诺了。   C   2   可能包含这个   行动;然而,阅读   ÿ   必须返回0 in   Ë   2   ,因为规则6.执行   Ë   2   因此与...相同   Ë   1   
  在   Ë   3   ,根据第7条,   r2 = y   可以看到发生的任何冲突写入   C   2   (只要   因为写入是在一致之前发生的。此操作现在可以看到1的写入   至   ÿ   在线程1中,已提交   C   1   。我们承诺一个额外的行动   C   3   :写1到   X   通过   x = r2   

我们不能提交r2 = y,其中y的值为1,因为y的读取将根据规则6返回0.但是根据E3中下一个提交周期中的文章,r2 = y可以看到y的值= 1,在Thread1中提交。 我怀疑是执行E3提交r2 = y还应该满足规则6并且应该只看到它之前发生的值,即x = 0。为什么在E2中由于规则6而提交r2 = y,y只能将y值读为0但在E3中提交r2 = y时,y可以读取在Thread1中写入的y = 1?

1 个答案:

答案 0 :(得分:0)

最值得注意的是规则7允许在 C i 中提交的读取看到 E i 而不是 E 中看到的那个。然而,这个薛定谔的阅读必须尽快解决。规则5确保此类读取必须在 E i + 1 中看到与 E 中相同的写入。

因此,如果您希望读取看到赛车写入,则不能在提交这两者的同一执行中具有该值。您需要等待下一次执行,并且您需要确保赛车写入不会违反发生 - 在排序之前(在我们的示例中,主要是在y = 0r2 = y之前发生的事件)

所以你在 C 2 E 2 中提交阅读r2 = y只有写y = 0因为写入发生在它之前,但是在 E 3 中,r2 = y可以看到它所用的赛车写入'建立之前发生的事情。

P.S。这篇推理在下面的几个句子的阅读r1 = x的论文中得到了解释:

  

C 4 ,作为 E 4 的一部分,包含读取r1 = x;由于规则6,它仍然看到0   我们的最终执行 E = E 5 ,但是,规则7允许r1 = x看到写入1 {{1}在 C 3 中提交的内容。