handling shared objects
Alex
sascha.orlov at gmail.com
Mon Nov 26 14:00:14 UTC 2018
Hi all!
Can somebody explain to me, why the example below is not working
in a way I'm expecting it to work?
My example is a little bit longer this time, however the half of
it is taken from
https://dlang.org/library/std/concurrency/receive_only.html
´´´
import std.experimental.all;
struct D
{
size_t d;
static S s;
}
struct S
{
D[] data;
}
struct Model
{
auto ref s()
{
return D.s;
}
void run()
{
"I'm running".writeln;
writeln(s.data.length);
}
}
Model m;
void main()
{
D.s.data.length = 4;
m.run; //4
auto childTid = spawn(&runner, thisTid);
send(childTid, 0);
receiveOnly!bool;
}
static void runner(Tid ownerTid)
{
receive((size_t dummy){
import core.thread : Thread;
m.run;
// Send a message back to the owner thread
// indicating success.
send(ownerTid, true);
});
}
´´´
The idea is:
the model is something that I can declare deliberately in the
application. And, I assumed that if it is (globally) shared, then
so are all compartments of it, even if they are not explicitly
part of the model.
Some problems arose:
1. Obviously, this is not the case, as the output is different,
depending on the thread I start the model function.
2. If I declare the model object inside the main, the compiler
aborts with the message "Aliases to mutable thread-local data not
allowed."
3. If I mark the S instance as shared, it works. But I didn't
intend to do this... Is this really how it meant to be?
As I'm writing the model object as well as all of its
compartments, I can do almost everything... but what I to avoid
is to declare the instances of compartments inside the model:
They are stored locally to their modules and the single elements
of them have to know about the compound objects, like with the D
and S structs shown.
More information about the Digitalmars-d-learn
mailing list