4

モジュールの 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 は一体何を意味するのでしょうか?

4

2 に答える 2

0

さて、もっと掘り下げていくつかのテストコードを書いた後、__gshared変数の詳細を除いて、それを処理できると思います。

ここから、モジュールの静的コンストラクターがスレッドごとに 1 回実行されます。その静的デコンストラクターは、スレッドの戻り時に実行されます。モジュールは、スレッドごとの疑似クラス「インスタンス」のように機能し、「メンバー」変数は TLS 変数であり、__gshared変数はそのクラスの静的変数のようなものです。私の考えでは、これが関係を形成します

オブジェクト: class:: :[変数moduleの論理コレクション]__gshared

[修飾子なし]: static:: [修飾子なし]:__gshared

ここで、各関係の後半は、マルチスレッドと静的コンストラクター/デストラクターによって形成されます。

したがって、私の理解に残された穴は、__gsharedモジュールの初期化にどのように適合するかということです。

他の誰かが、私が受け入れることができるその穴を埋めるより良い答えを思い付くことを願っています.

于 2013-08-10T02:11:23.933 に答える