On 14.08.2015 11:51, Jonathan Wakely wrote:
On 14 August 2015 at 01:37, Andrey Semashev wrote:
1. Is my test valid or is there a flaw that I'm missing?
The cppmem tool at http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/ shows
that there are consistent executions where (x==0 && y==0) is true. I
used this code:
int main() {
atomic_int a = 0;
atomic_int b = 0;
int x, y;
{{{
{
a.store(1,mo_seq_cst);
a.load(mo_relaxed);
x = b.load(mo_relaxed);
}
|||
{
b.store(1, mo_seq_cst);
b.load(mo_relaxed);
y = a.load(mo_relaxed);
}
}}}
return 0;
}
I'm not familiar with that tool and not sure how to interpret its
output, but I think it misses one point that is present in the original
test and I failed to mention. The Boost.Atomic test uses Boost.Thread
barriers to ensure that both threads have executed the store-load-load
region before checking for x and y.
Otherwise I cannot see how (x==0 && y==0) could happen. The last load in
each thread is sequenced after the first seq_cst store and both stores
are ordered with respect to each other, so one of the threads should
produce 1.