On 07/10/2010 21:32, Stanislav Blinov wrote: > Steven Schveighoffer wrote: > >>> What I'd propose is either: >>> 1) Create your own lock-free associative array (yup, reinvent the >>> wheel to introduce AA to the world of 'shared') >>> 2) In this small case it may seem best (though mind that often such >>> cases do grow up to the point when you still need to rethink design): >>> Make your associative array __gshared and perform synchronization by >>> hand, i.e. create a static Mutex (from core.sync.mutex) variable and >>> initialize it in your CRegistry's static ctor, and then enclose all >>> access to associative array in synchronized(mutex) {} blocks. >>> >>> Maybe concurrent-programming-in-D guru may propose simpler solution, >>> but I don't see another. >> >> FWIW, the classinfo of a class is an object, and as such can be used >> as sort of a global lock without having to use a static constructor: >> >> synchronized(this.classinfo) >> { >> .... >> } >> >> -Steve > > Thanks. To my shame, I repeatedly keep forgetting about this. Thanks for the suggestions. I'm keen to avoid locks as everything so far is message parsing and the system is real-time. Having lots of threads that all talk to each other I needed a place to keep the Tid's which is accessible to everyone. There is no conflict because the main thread creates all others and registers the Tid's. Once the threads go the registry is read only. Just setting __gshared makes the app work. This may not be good practice I know and I will come back to it when I have more time.
I'm not sure how to use synchronized(this.classinfo). Is this in combination with __gshared to synchronise access at the method level. Is it like a wrapper that goes inside the method? bob