スポンサーリンク
スポンサーリンク

C#マルチスレッドにおけるStatic変数のスコープ

C#Visual StudioWindowsフォームアプリ

staticを宣言したメソッドであっても、メソッド内で宣言されている変数はマルチスレッド間で共有されず、クラスのstaticメンバ変数は共有される。

staticメソッド内で宣言されている変数がマルチスレッド間で共有されないのは、変数のスコープ仕様的に、whileループの中で宣言された変数が、その外側では使えないのと同じ。

この事から、スタックメモリで実行されるstaticメソッドを、マルチスレッドアプリケーションで利用しても、安全だと分かる。

以下、実験したソースと実行結果。
ソースコードはGitHubで公開しています。

メソッド内の変数を使ってループするstaticメソッドと、クラスのstaticメンバ変数を使ってループするstaticメソッド。これをシングルスレッド、マルチスレッドそれぞれで検証する。

1、メソッド内の変数でループするstaticメソッドを、シングルスレッドで実行する。

実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。

2、メソッド内の変数でループするstaticメソッドを、マルチスレッドで実行する。

実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。 staticメソッド内で宣言されている変数は、マルチスレッド間で共有されない。

3、クラスのstaticメンバ変数でループするstaticメソッドを、シングルスレッドで実行する。

実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。

4、クラスのstaticメンバ変数でループするstaticメソッドを、マルチスレッドで実行する。

実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999までの値がランダムに、1ファイル辺り330行程度出力される。 クラスのstaticメンバ変数は、マルチスレッド間で共有される。

インスタンスを分けても、クラスのstaticメンバ変数は、マルチスレッド間で共有される。

 

コメント

タイトルとURLをコピーしました