スレッド局所記憶

ストレージクラスstaticは一度だけ初期化されるオブジェクトの宣言を 可能にします。次に同じ行が実行される時、初期化は省略されます。 各スレッドは自分のstaticオブジェクト(TLS - スレッド局所記憶)を得て、 他のスレッドのstaticオブジェクトを読みこんだり変更したりできなくなります - 変数名は 同じままで。従ってstatic現在のスレッドのグローバルの状態を保つ オブジェクトの宣言を可能にします。

これはstaticが実際にアプリケーションでグローバルであることを意味する、 マルチスレッドアプリケーションでの同期の問題を有するC/C++やJavaなどの例とは異なります。

static変数に割り当てられる値はコンパイル時に計算可能でなければなりません。 実行時依存は持てません!これはstatic変数を実行時に構造体、クラス、モジュールの static this()ワンタイムコンストラクタを使って初期化することを可能にします。

static int b = 42;
// bは一度だけ初期化されます!
// 異なるスレッドで実行するとき各bは
// 他のスレッドへのインターフェース
// のない"自分の"bを見ます

さらにすべてのスレッドが閲覧と修正をできる"クラシックな"グローバル変数の宣言には、 Cのstaticと等価の__gsharedストレージクラスを使います。 醜い名前は頻繁に使わないためのフレンドリーな念押しです。

__gshared int b = 50;
// これも一度だけ初期化されます!
// すべてのスレッドが読み込め、
// それを危険にする変更ができる真にグローバルなbです。

掘り下げる

rdmd playground.d