【问题标题】:Can we use volatile writes exclusively to enforce cache coherence?我们可以专门使用易失性写入来强制缓存一致性吗?
【发布时间】:2015-03-12 02:10:57
【问题描述】:

我遇到了以下说法:“读取或写入 volatile 变量会施加内存屏障,其中整个缓存都被刷新/无效。”

现在考虑以下执行场景:

初始volatile boolean barrier;
初始int b = 0;

线程 1 b = 1; // write1
线程 1 barrier = true; // write2
线程 2 barrier = true; // write3
线程 2 print(b); // r1

问题:线程 2 是否保证打印 1?

根据声明,我会回答是:线程 1 在 write2 上刷新其缓存(以便b = 1 最终进入主内存),线程 2 在 write3 上使其缓存无效(以便它将读取 b来自主内存)。

但是,在相关的JLS sections 中,我无法为这种行为找到保证,因为 write3 是写入,而不是读取。因此,以下看似关键的条款不适用:

对 volatile 变量 v(第 8.3.1.4 节)的写入与任何线程对 v 的所有后续读取同步(其中“后续”是根据同步顺序定义的)。 p>

我是否遗漏了一些其他信息,或者我可能误解了什么?

(相关问题:

【问题讨论】:

  • 如何确保线程 2 中的 write3 发生在线程 1 中的 write1 之后?如果您可以确保写入按该顺序发生,那么我猜b == 1 将在线程 2 中看到。
  • @jepio:我并不是要确保任何事情——只是描述一个可能的执行场景。那么,在这种情况下,线程 2 是否无法读取 b 的缓存/陈旧值?

标签: java memory concurrency keyword volatile


【解决方案1】:

我认为,您在引用的短语中突出显示了一个错误的词(我的意思是,它与读取同步的事实到目前为止还不是这里的主要问题):“对 volatile 变量 v 的写入(第 8.3.1.4 节) ) 与任何线程的所有后续读取 v 同步”。 请注意,它根本没有说明其他变量的读取。众所周知,Thread-1 的b 版本可能仍在注册中。

【讨论】:

  • "众所周知,Thread-1 的 b 版本可能仍在寄存器中。"鉴于处决,这是否与我提出问题时提出的主张相矛盾?
【解决方案2】:

在缓存刷新/失效方面对 volatile 的推理会导致更多的混乱,并且它不会呈现完整的画面。

对 volatile 变量 v(第 8.3.1.4 节)的写入与任何线程对 v 的所有后续读取同步(其中“后续”是根据同步顺序定义的)。

变量的易失性写入,然后在其他线程中读取该变量会在保证发生之前建立较弱的一致性。

即在操作码中稍作改动

thread 1 b = 1; // write1
thread 1 barrier = true; // write2
thread 2 while(!barrier) // read barrier
thread 2 print(b); // r1

现在保证将 b 打印为 1。

现在,如果您看到线程 2 何时将屏障读取为真,那么线程 2 可以保证看到在按程序顺序写入屏障之前发生的所有事情。

如果您需要查看 volatile 方面的障碍,请参考 http://gee.cs.oswego.edu/dl/jmm/cookbook.html.

简单来说 volatile 实现调用两种东西 第一个编译器受限于可以针对易失性读写进行优化的内容。其次,更重要的是实现了

    as volatile read -> loadload 
       volatile wtire - > storeStore|loadStore  
before write and StoreLoad after write.

这里 loadload 意味着处理invalidate queue 在读取下一个值之前确保读取最新值。 StoreStore 表示在写入下一个值之前刷新存储缓冲区。

http://gee.cs.oswego.edu/dl/jmm/cookbook.htmlhttp://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 2015-09-06
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2021-07-18
    • 2016-12-25
    相关资源
    最近更新 更多