[dmd-concurrency] synchronized, shared, and regular methods inside the same class

Kevin Bealer kevinbealer at gmail.com
Tue Jan 5 14:30:38 PST 2010


That's what I was guessing.  But then I thought maybe there might be some
magic that either inserted a lock around the block of instructions from the
first read to the last write, or else that detected these primatives and
emitted a warning.  Not that I'm suggesting that approach, as a general
solution is probably impractical / full of landmines.  And I guess getting
lock free systems right is normally considered an "experts only" kind of
thing, except maybe the one-pointer versions like linked list.

Kevin

On Tue, Jan 5, 2010 at 1:21 PM, Sean Kelly <sean at invisibleduck.org> wrote:

>  On Jan 5, 2010, at 10:14 AM, Kevin Bealer wrote:
>
> > On Mon, Jan 4, 2010 at 6:58 PM, Andrei Alexandrescu <andrei at erdani.com>
> wrote:
> >
> > shared int x;
> > ...
> > ++x;
> >
> > The putative user notices that that doesn't work, so she's like, meh,
> I'll do this then:
> >
> > int y = x;
> > ++y;
> > x = y;
> >
> > And the user remains with this impression that the D compiler is a bit
> dumb. Of course that doesn't avoid the race condition though. If the user
> would have to call atomicIncrement(x) that would be clearly an improvement,
> but even this would be an improvement:
> >
> > int y = sharedRead(x);
> > ++y;
> > sharedWrite(y, x);
> >
> > When writing such code the user inevitably hits on the documentation for
> the two intrinsics, which clearly define their guarantees: only the sequence
> of sharedRead and sharedWrite is preserved. At that point, inspecting the
> code and understanding how it works is improved.
> >
> > ...
> > Andrei
> >
> > Just to clarify, this is still broken, right?  I mean that if two users
> are calling a method that does this,
> > the value of x will only get incremented once if their calls to
> sharedRead/sharedWrite are interleaved?
>
> Yes.  You either need to call a special hardware instruction (LOCK INC on
> x86) or use a CAS loop:
>
> void increment( ref shared int x )
> {
>    int t;
>    do {
>        t = atomicLoad( x );
>    } while( !atomicStoreIf( x, t + 1, t ) );  // atomicStoreIf is a CAS
>  }
>
> _______________________________________________
> dmd-concurrency mailing list
> dmd-concurrency at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-concurrency
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/dmd-concurrency/attachments/20100105/1ececb2b/attachment.htm>


More information about the dmd-concurrency mailing list