[cpp-threads] Yet another visibility question
Boehm, Hans
hans.boehm at hp.com
Wed Nov 29 23:18:28 GMT 2006
Partially correcting myself:
I think the analysis below applies if x is an atomic, even if it is
accessed with unordered operations. If x is an ordinary variable, there
is a race between the assert and the assignment to x. And I think
that's what we want here.
Hans
> -----Original Message-----
> From: cpp-threads-bounces at decadentplace.org.uk
> [mailto:cpp-threads-bounces at decadentplace.org.uk] On Behalf
> Of Boehm, Hans
> Sent: Tuesday, November 28, 2006 5:55 PM
> To: C++ threads standardisation
> Subject: RE: [cpp-threads] Yet another visibility question
>
> I had missed this question, and I'm still thinking about
> wording changes for per-variable release store ordering.
>
> For the example below, assuming an assertion fails:
>
> (I'm assuming a version of assert that prints a message and
> continues; otherwise no execution in which the assertion
> fails can not have x set to 1 at all; thus such an execution
> could never be legal.)
>
> - Accesses to y induce no synchronizes-with relationships at
> all, even after the reformulation.
>
> - The assignment to x is inter-thread-ordered after the
> corresponding fetchadd_release.
>
> - The assertions are inter-thread-ordered-before the
> corresponding fetch_add_release.
>
> - Each fetchadd_release precedes (but does not happen-before)
> the one that reads its result.
>
> Thus currently if the assertion fails in the thread A that
> sets y to N-1, we have a cycle in the precedes relation, and
> this would be disallowed. Assuming B sets x to 1:
>
> (A: assert) precedes (A: fetch_add) precedes (B: fetch_add)
> precedes (B:
> x = 1) precedes (A: assert)
>
> If the assertion fails in another thread, we simply get a
> longer chain of fetchadds in the middle.
>
> Thus I think this is already disallowed in the current
> version, though the reasoning is a bit subtle.
>
> Hans
>
>
> > -----Original Message-----
> > From: cpp-threads-bounces at decadentplace.org.uk
> > [mailto:cpp-threads-bounces at decadentplace.org.uk] On Behalf
> Of Peter
> > Dimov
> > Sent: Tuesday, November 28, 2006 2:06 PM
> > To: C++ threads standardisation
> > Subject: Re: [cpp-threads] Yet another visibility question
> >
> > Ping? :-)
> >
> > Peter Dimov wrote:
> > > Another question:
> > >
> > > // x y initially zero
> > >
> > > // threads 1 to N:
> > >
> > > assert( x == 0 );
> > >
> > > if( fetchadd_release( &y, 1 ) == N - 1 ) {
> > > x = 1;
> > > }
> > >
> > > Are the asserts guaranteed to pass? Informally, the causality
> > > constraint prevents the compiler or the hardware from
> speculatively
> > > executing the store before the fetchadd, even though there's no
> > > acquire label. But what does the MM say?
> >
> > --
> > cpp-threads mailing list
> > cpp-threads at decadentplace.org.uk
> > http://www.decadentplace.org.uk/cgi-bin/mailman/listinfo/cpp-threads
> >
>
> --
> cpp-threads mailing list
> cpp-threads at decadentplace.org.uk
> http://www.decadentplace.org.uk/cgi-bin/mailman/listinfo/cpp-threads
>
More information about the cpp-threads
mailing list