ブーストアトミックのドキュメントを調べていたところ、次の例に出くわしました。
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 がどのように競合するのかを説明していただければ幸いです。