Passing a class instance to a thread via spawn()

Ali Çehreli acehreli at
Thu Jul 18 16:54:20 PDT 2013

On 07/18/2013 04:23 PM, Joseph Rushton Wakeling wrote:

 > Hello all,
 > I have a data structure which is a final class.  Once created, the 
contents of
 > the class will not be mutated (only its const methods will be called).
 > Is there any way to pass this to a thread via spawn() or via 
 > I've seen instructions to use shared() but if I try and declare the 
class this
 > way I get errors such as "non-shared method is not callable using a 
 > object" and "non-shared const method is not callable using a shared 
 > The ideal would be to mark this object, once created, as immutable -- 
but trusty
 > methods like assumeUnique() don't work for classes!
 > Can anyone advise?
 > Thanks & best wishes,
 >       -- Joe

The following seems to work but it may have more 'immutable' keywords 
than you need. For example, the final class F need not be 'immutable'. I 
think it is the objects of it that you want 'immutable'. (?)

Anyway, the following may be a start:

import std.concurrency;
import core.thread;

interface I
     int foo();

class C : I
     int i;

     this(int i) immutable {
         this.i = i;

     override int foo() {
         return 1;

immutable final class F : C
     double d;

     this(int i, double d) immutable {
         this.d = d;

     /* 'override' keyword is required if the class is non-immutable
      * and not required otherwise. Bug? */
     int foo() {
         return 2;

     int bar() const {
         return 3;

void worker(immutable(F) f)

void main()
     auto f = new immutable(F)(42, 1.5);

     spawn(&worker, f);



More information about the Digitalmars-d-learn mailing list