"Dmitriy V'jukov" <> 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