我不理解来自here的这个示例:
“假设'x'和'y'最初为0:
-Thread 1-
y.store (20, memory_order_release);
-Thread 2-
x.store (10, memory_order_release);
-Thread 3-
assert (y.load (memory_order_acquire) == 20 && x.load (memory_order_acquire) == 0)
-Thread 4-
assert (y.load (memory_order_acquire) == 0 && x.load (memory_order_acquire) == 10)
这两个断言都可以通过,因为在线程1和线程2中的存储之间没有强制排序。
如果使用顺序一致的模型编写此示例,则其中一个存储必须在另一个之前发生(尽管直到运行时才确定顺序),这些值在线程之间同步,如果有一个断言传递,另一个断言因此必须失败。 “
为什么在acquire/release
两个断言可以通过?
答案 0 :(得分:1)
当你的内存模型不是顺序一致的时候,不同的线程可以看到世界的不同状态,并且这样一种方式就是没有单一的全局状态(或状态序列)与两个线程一致见。
在示例中,线程3可以看到如下世界:
x = 0
y = 0
y = 20 // x still 0
线程4可以看到世界如下:
x = 0
y = 0
x = 10 // y still 0
世界上没有全局状态变化序列同时与这两个视图兼容,但如果内存模型不是顺序一致的话,这正是允许的。
(事实上,这个例子并没有包含任何证明发布/获取所提供的肯定排序保证的东西。所以这里有很多东西比这里捕获的更多,但它是一个很好的,简单的演示复杂性的例子。放松记忆命令。)