易失性读取发生在易失性写入之前吗?


问题内容

我尝试了解为什么此示例是正确同步的程序:

a - volatile
Thread1:
x=a
Thread2:
a=5

由于存在冲突的访问(存在对a的写入和读取),因此在每个顺序一致性中,必须在访问之间的关系之前执行。假设顺序执行之一:

1. x=a
2. a=5

是1发生-在2之前发生,为什么?


问题答案:

不,在相同变量的易失性写入之前(以同步顺序),在易失性写入 之前 不一定 会发生 易失性读取。

这意味着它们可能处于“数据争用”中,因为它们“冲突的访问未按先发生后关系进行排序”。如果是这样,那么几乎所有程序都包含数据争用:)但这可能是规范错误。易失性读写不应该被视为数据竞争。如果程序中的所有变量都是易失性的,则所有执行在顺序上都是一致的。参见http://cs.oswego.edu/pipermail/concurrency-
interest/2012-January/008927.html