TDPL, shared data, and Phobos
Graham St Jack
graham.stjack at internode.on.net
Sat Jul 17 15:57:47 PDT 2010
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).
More information about the Digitalmars-d
mailing list