【发布时间】:2013-11-15 15:59:56
【问题描述】:
我不明白来自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中的两个assert可以通过?
【问题讨论】:
-
@Oswald - 在这种情况下,伪代码就足够了。这就是通常描述和分析这种低级内容的方式。 SCCE 无济于事,因为运行它不会告诉您任何有用的信息:它可能会或可能不会显示排序差异,具体取决于系统和计时的详细信息。
标签: c++ multithreading concurrency atomic