Re: Subtle difference between C++0x MM and other MMs
"Dmitriy V'jukov" <dvyukov@gmail.com> writes:
On Sep 4, 11:47?am, Anthony Williams <anthony....@gmail.com> wrote:
Or put this way.
'synchronizes-with' definition contains something like '... acquire
operation which loads value stored by X ...'. Reasoning behind this
formulation is (as I understand it):
1. 'loads value stored by X' means that operation happens after X.
It's obvious, it's a casual relation.
2. 'acquire operation' means that subsequent operations can't hoist
above this operation.
Now consider 'store operation which follows X in modification order of
M, followed by full fence'. Here:
1. 'operation which follows X in modification order of M' means that
operation happens after X. It's a kind of casual relation too.
Yes it's later in the modification order of M, but that doesn't mean
that other operations that happen-before the first store (A) also
happen-before the second store (B).
Other operations can happen after store (B). It's perfectly Ok. They
must not happen after seq_cst fence!
If they are stores to other memory locations that's not guaranteed.
std::atomic_int x,m;
void thread1()
{
x.store(1,std::memory_order_relaxed);
m.store(1,std::memory_order_release); // A
}
void thread2()
{
m.store(2,std::memory_order_relaxed); // B
std::atomic_thread_fence(std::memory_order_seq_cst); // C
int z=x.load(std::memory_order_relaxed);
}
First off, thread2() does no loads, so there is no way it can tell
whether A or B comes first in the modification order of m.
Since we don't know which comes first, we don't know whether z will
have the value 1 or 0.
Even if we read back the value of m and found that it had the value
"2", we wouldn't have any extra information, since the store A could
just not have become visible to thread2 yet.
Stores clobber release sequences. If you need the ordering
information, use a RMW operation such as exchange().
Anthony
--
Anthony Williams | Just Software Solutions Ltd
Custom Software Development | http://www.justsoftwaresolutions.co.uk
Registered in England, Company Number 5478976.
Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL