digitalmars.D.learn - Passing a class instance to a thread via spawn()
- Joseph Rushton Wakeling (12/12) Jul 18 2013 Hello all,
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (54/66) Jul 18 2013 message-passing?
- Joseph Rushton Wakeling (2/78) Jul 19 2013 That's a very interesting idea. Thanks so much for sharing! :-)
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 message-passing? 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 shared object" and "non-shared const method is not callable using a shared object". 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
Jul 18 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, thecontents ofthe 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 viamessage-passing?I've seen instructions to use shared() but if I try and declare theclass thisway I get errors such as "non-shared method is not callable using asharedobject" and "non-shared const method is not callable using a sharedobject".The ideal would be to mark this object, once created, as immutable --but trustymethods like assumeUnique() don't work for classes! Can anyone advise? Thanks & best wishes, -- JoeThe 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 { super(i); 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) { f.bar(); } void main() { auto f = new immutable(F)(42, 1.5); spawn(&worker, f); thread_joinAll(); } Ali
Jul 18 2013
On Thursday, 18 July 2013 at 23:54:22 UTC, Ali Çehreli wrote:On 07/18/2013 04:23 PM, Joseph Rushton Wakeling wrote:That's a very interesting idea. Thanks so much for sharing! :-)Hello all, I have a data structure which is a final class. Oncecreated, the contents ofthe class will not be mutated (only its const methods will becalled).Is there any way to pass this to a thread via spawn() or viamessage-passing?I've seen instructions to use shared() but if I try anddeclare the class thisway I get errors such as "non-shared method is not callableusing a sharedobject" and "non-shared const method is not callable using ashared object".The ideal would be to mark this object, once created, asimmutable -- but trustymethods like assumeUnique() don't work for classes! Can anyone advise? Thanks & best wishes, -- JoeThe 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 { super(i); 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) { f.bar(); } void main() { auto f = new immutable(F)(42, 1.5); spawn(&worker, f); thread_joinAll(); } Ali
Jul 19 2013