D const enables multi-reader synchronization
Brad Roberts
braddr at slice-2.puremagic.com
Mon Jun 14 15:44:22 PDT 2010
On Mon, 14 Jun 2010, Tomek Sowi?ski wrote:
> Dnia 14-06-2010 o 21:27:24 Brad Roberts <braddr at slice-2.puremagic.com>
> napisa?(a):
>
> > Const methods only prevent mutating 'this'. You can still call functions
> > that mutate other state (via globals or passed in arguments).
>
> But synchronized on a method also protects only 'this', no?. Currently you can
> have:
>
> class A { ... }
>
> shared class K {
> synchronized void fun(A a) const {
> // mutate a
> }
> }
>
> If you call fun on two instances of K, each in a different thread, but pass
> them the same instance of A, you'll get a data race anyway. You could make
> fun's arguments const, but still there's shared globals.
The lock is per-object but the lock protects all of the code inside the
block, not just the parts that hang off the this reference.
You're code describes the case I'm talking about. If the mutations to A
are all inside the K::fun code, and your proposal happens, then code that
runs safely changes to code that runs unsafely.
I'm not saying it's a good idea to structure code that way, but the
language rules need to consider all angles, not just the used correctly or
best practices uses.
More information about the Digitalmars-d
mailing list