获取/释放内存排序示例

时间:2013-11-15 15:59:57

标签: c++ multithreading concurrency atomic

我不理解来自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两个断言可以通过?

1 个答案:

答案 0 :(得分:1)

当你的内存模型不是顺序一致的时候,不同的线程可以看到世界的不同状态,并且这样一种方式就是没有单一的全局状态(或状态序列)与两个线程一致见。

在示例中,线程3可以看到如下世界:

x = 0
y = 0
y = 20    // x still 0

线程4可以看到世界如下:

x = 0
y = 0
x = 10    // y still 0

世界上没有全局状态变化序列同时与这两个视图兼容,但如果内存模型不是顺序一致的话,这正是允许的。

(事实上,这个例子并没有包含任何证明发布/获取所提供的肯定排序保证的东西。所以这里有很多东西比这里捕获的更多,但它是一个很好的,简单的演示复杂性的例子。放松记忆命令。)