Passing a class instance to a thread via spawn()
Ali Çehreli
acehreli at yahoo.com
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
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
>
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 {
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
More information about the Digitalmars-d-learn
mailing list