Head Const

Bottled Gin via Digitalmars-d digitalmars-d at puremagic.com
Wed Feb 17 23:59:54 PST 2016


Too illustrate how headconst can help with multithreading (shared 
memory) code, I have created this small snippet. In my 
experience, there are lots of *effectively immutable* objects 
(like Foo.bar in the code snippet). If these variables can be 
declared headconst, a lot of hierarchical synchronization locking 
(and therefor deadlock situations) can be saved. In the present 
Dlang semantics we do not have any specifier to make *effective 
mutability* effective. So presently I have to create a naming and 
coding discipline when declaring and using effectively mutable 
hierarchical objects.


class Bar {
   void funcBar() { }
}

class Frop {
   void funcFrop() { }
}

class Foo {
   this() {
     synchronized(this) {
       bar = new Bar();
     }
   }

   void setFrop() {
     frop = new Frop();
   }

   headconst Bar bar;		// effectively immutable
   Frop frop;			// mutable

   void funcBar() {		// no locking required
     bar.funcBar();		// since bar is effectively immutable
   }

   void funcFrop() {
     synchronized(this) {	// lock necessary since frop
       frop.funcFrop();		// is mutable
     }
   }
}

void main() {
   Foo foo = new Foo();
   // yield for other threads
   // foo.setFrop();    // in some other thread
   foo.funcBar();
   foo.funcFrop();
}



More information about the Digitalmars-d mailing list