我打算在升压原子的文档和我碰到下面的例子就是:需要帮助理解Boost.Atomic内存模型`memory_order_release`例
atomic<int> a(0);
thread1:
... /* A */
a.fetch_add(1, memory_order_release);
thread2:
int tmp = a.load(memory_order_acquire);
if (tmp == 1)
{
... /* B */
}
else
{
... /* C */
}
现在我还是有点糊涂关于memory_order_release和memory_order_acquire。该文档描述了他们为:
memory_order_release
执行释放操作。非正式的说,防止所有在前的 内存操作重新排序过去这一点。
memory_order_acquire
执行获取操作。非正式的说,在这之前阻止成功的内存操作被重新排序。
即使有了这些例子,我仍然有点困惑。如果有人能够解释上述定义的含义以及A和C如何发生冲突,我将不胜感激。
感谢您的答复。这解释了很多。还有一个问题,在你的帖子开头你说过:“这些定义意味着在存储之后,A中的所有内存操作都不能重新排序。你能解释一下在这里重新排序意味着什么“非内存操作可以重新排序”是什么意思? – MistyD
@MistyD:如果A的最后一行包含对变量'b'的更新,'memory_order_release'确保编译器和CPU都不会在更新到'a'之后将写入重新排序到'b'。没有这个保证,如果B访问'b',可能会出现竞争条件 –