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