或者,我们什么时候需要
LoadStore
屏障?
根据Doug Lea,
所以,看来(LoadStore) 确保 Load1 的数据在与 Store2 相关的所有数据和后续存储指令刷新之前加载
load
的结果只能在
store
完成后才能得到。
毕竟,直到商店完成前的最后一刻,load
的结果都可能处于过时状态。所以在我看来,这个障碍只适用于以下模式:
load r1 [x1]; // load operation
#LoadStore barrier
store [y1] r2; // store operation
...
//other operations really need newest [x1]
...
这个例子正确吗?如果不对请指正。
另外,您能提供一下出现这种模式的具体情况吗?
我真的很感谢任何意见或建议。
重要的一点是可以存在不同版本的内存。因此,“加载存储”模式需要考虑对同一内存执行访问的其他处理。 在这种情况下,版本的某些更新可能会导致不一致。设想一个“阅读副本更新”列表。 进程通过“加载”获取列表的当前版本,并“存储”该版本以将其保留在另一个结构或位置中。 完成后,该过程可以使用该版本的列表。
我认为还有很多其他模式。 例如,图 4 中 Algave 博士的论文
Herding Cats
有一些表格,您应该熟悉您引用的 Doug Lea 的 Java 内存模型页面。 具体来说,“R/W”用于负载缓冲(重复“R/W”排序)和其他模式,例如写入到读取因果关系。 如果您查看第 9 章,您可以找到对不同开源“C”程序的参考,这些程序使用“cbmc”扫描这些模式(似乎也已移植到 ebmc)。