TDPL, shared data, and Phobos

Sean Kelly sean at invisibleduck.org
Sun Jul 18 09:05:08 PDT 2010


Graham St Jack <graham.stjack at internode.on.net> wrote:
> On Sat, 17 Jul 2010 11:42:03 -0400, Sean Kelly wrote:
> 
>> The casts are necessary because I haven't yet applied 'shared' to
>> druntime.  I ran into a few issues when doing so and rolled back my
>> changes.  I'll give it another shot before the next release.
> 
> I'm glad you announced you intention - I was just about to roll up my 
> sleeves and give it a go for Condition, but will wait for the next 
> release.
> 
> Like all my previous attempts to use shared, I have waited for quite a
> 
> while for things to improve, tried using shared again, hit a brick
> wall 
> and resorted to defeating the compiler's detection of shared data.
> 
> TDPL raised my hopes without actually making it clear how to use 
> synchronized classes. Alas, it seems to me that they still aren't
> usable 
> in practice. With any luck the problems are just library issues which
> can 
> be fixed relatively easily.
> 
> Like Brian Palmer, I am frustrated by the lack of documentation about 
> shared and druntime's sync package, and am happy to lend a hand if
> that 
> would be helpful.
> 
> The code I am trying to write is a simple synchronized class with a 
> Condition, but I can't create a Condition on a shared "this".
> 
> A cut-down version of what I want to write is:
> 
> synchronized class Foo {
>   Condition mCondition;
>   this() {
>     mCondition = cast(shared) new Condition(this);
>   }
>   void some_method() {
>   }
> }
> 
> I realise that Condition wants a Mutex, but a synchronized class
> already 
> has an implicit one which is implicitly used by all the methods, so
> the 
> above is definitely what I want to write.
> 
> What I have to write instead (which avoids the compiler noticing that 
> anything is being shared) is:
> 
> class Foo {
>   Mutex     mMutex;
>   Condition mCondition;
>   this() {
>     mMutex = new Mutex();
>     mCondition = new Condition(mMutex);
>   }
>   void some_method() {
>     synchronized(mMutex) {
>     }
>   }
> }
> 
> The latter works just fine, but it is very disappointing after all the
> 
> fuss about how important shared is that you can't actually use it for
> the 
> most mainstream of all uses - a synchronized class with a condition 
> (which is what a message queue between threads is supposed to be).

new Mutex(this) makes the mutex the object monitor, so it will be what's
locked for synchronized functions.


More information about the Digitalmars-d mailing list