モジュールの static this() でいくつかのグローバル変数といくつかのスレッドローカル変数が初期化され (たとえば、 TLS a
、 global b
、 TLS c
、および globalがこの順序で初期化され)、その static ~this() で初期化解除されたとします。d
シングルスレッドとマルチスレッドの両方のアプリケーションで変数を初期化するためにプログラムが実行する手順を教えてください。
または、本当に恐ろしい仮定をしている場合は修正してください。
編集:もう少し明確にするために:
module mymodule;
int a;
__gshared int b;
int c;
__gshared d;
static this()
{
a = 2; b = 3; c = 4; d = 1337;
}
static ~this()
{
if(a == 2)
dosomefunc(b);
// and other nonsensical things that involve branching on the TLS and using the globals.
}
生成されたスレッドで a の値を変更し、メイン スレッドでは決して変更しないとどうなりますか? dosomefunc()
呼ばれたことはありますか?ここにあるはずの実際の動作は何ですか?また、その動作は何に依存していますか? TLS に関してモジュール初期化子はどのように呼び出されますか? それらは一度だけ呼び出され、TLS 変数は値の初期化を超えてシャフトを取得しますか? これら 2 つの (de)initializer は一体何を意味するのでしょうか?