How to initialize a globle variable nicely and properly?
Heromyth
bitworld at qq.com
Sat Dec 15 02:54:55 UTC 2018
We have a module including many globle variables which are needed
to be initialized firstly in "shared static this() {}", see here
https://github.com/huntlabs/hunt/blob/master/source/hunt/time/Init.d.
The problem is that these variables are not always initialized
firstly when are referenced by some others moudles in "static
this() {}". Here is a demo to illustrate it.
//////////////////
// module A
//////////////////
module test.A;
import std.stdio;
import core.thread;
import core.time;
class A {
__gshared int sharedField;
shared static this() {
writeln("running A in shared static this(),
sharedField=", sharedField);
Thread th = new Thread(() { });
th.start();
Thread.sleep(100.msecs);
sharedField = 2;
writeln("running A done in shared static this(),
sharedField=", sharedField);
}
static this() {
writeln("running A in static this(), sharedField=",
sharedField);
}
}
//////////////////
// module B
//////////////////
module test.B;
import test.A;
import std.stdio;
import core.thread;
shared static this() {
writeln("running in shared static this() from B");
}
class B {
shared static this() {
writeln("running B in shared static this(),
sharedField=", A.sharedField);
}
static this() {
// bug is here
writeln("running B in static this(), sharedField=",
A.sharedField);
}
}
//////////////////
// module main
//////////////////
import std.stdio;
import test.A;
import core.thread;
void main()
{
writeln("running in main.");
}
//////////////////
// output
//////////////////
Running ./demo
running A in shared static this(), sharedField=0
running A in static this(), sharedField=0
running B in static this(), sharedField=0 // bug is here
running A done in shared static this(), sharedField=2
running in shared static this() from B
running B in shared static this(), sharedField=2
running A in static this(), sharedField=2
running B in static this(), sharedField=2
running main.
====================
You can see the sharedField is 0 in B's static this() at first.
If Thread is disabled to run in shared static this(), this
problem seems to be fixed.
Some related bugs:
1) https://issues.dlang.org/show_bug.cgi?id=6114
2) https://issues.dlang.org/show_bug.cgi?id=4923
More information about the Digitalmars-d-learn
mailing list