WordCount performance

Sean Kelly sean at invisibleduck.org
Sat Mar 29 12:53:53 PDT 2008


== Quote from Kevin Bealer (kevinbealer at gmail.com)'s article
> Sean Kelly Wrote:
> > == Quote from Benji Smith (benji at benjismith.net)'s article
> > > Walter Bright wrote:
> > > > Sean Kelly wrote:
> > > >> Another option might be to check the thread count is greater than
> > > >> 1 and only lock if it is.  Tango has a routine called thread_needLock
> > > >> for this purpose, though it goes a bit farther and is true once a
> > > >> thread has been created through program termination.  This avoids
> > > >> problems with the situation where you have multiple threads running
> > > >> and all but one terminate but memory is not yet synchronized.
> > > >
> > > > You have to be very careful with such schemes because they can run afoul
> > > > of the notoriously difficult to comprehend "double checked locking" bug.
> > > I thought the double-checked locking idiom was only buggy in the Java
> > > memory model (prior to being fixed in the 1.6 JDK).
> >
> > It's broken in C++ as well.  It actually works in D however, provided one uses
> > 'volatile' in the right places.  I posted a demo impl a few years back either in
> > this forum or in D.announce.
> >
> >
> > Sean
> Couldn't you two mutexes to make this work even in C++ (but I'm using D syntax for simplicity)?  The
second mutex doesn't actually protect anything, but it should be a portable way to include the memory
barriers.  Actually "portable" is a weasel word since all C++ locking and multithreadedness is done in
platform depended libraries.
> class Foo {
> private:
>     Object data;
>     Mutex a, b;
> public:
>     Object getData()
>     {
>         if (data is null) {
>             a.lock();
>             if (data is null) {
>                 Object o = null;
>                 {
>                     b.lock();
>                     o = new Object;
>                     b.unlock();
>                 }
>                 data = o;
>             }
>             a.unlock();
>         }
>         return data;
>     }
> };

That seems like it might work.


Sean



More information about the Digitalmars-d mailing list