現在のC++0x ドラフトでは、セクション 29.3.9 および 29.3.10 の 1111 ~ 1112 ページに次の例のように記載されています。
// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);
// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);
r1 = r2 = 1各スレッドの操作が緩和され、無関係なアドレスに送信されるため、結果は可能です。ここで、私の質問は、次の (同様の) 例の考えられる結果についてです。
// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);
// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);
r1 = r2 = 1この場合、結果はありえないと思います。可能であれば、y のロードは y へのストアと同期します (つまり、前に発生します)。x と同様に、x のロードは x へのストアの前に発生します。ただし、y のロードは、x へのストアの前に順序付けられます (したがって、前に発生します)。これにより、循環的な事前発生関係が作成されますが、これは許可されていないと思います。