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

C#マルチスレッドプログラムにおける変数の有効範囲

C#Visual Studio

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

以下、実験したソースと実行結果。

実験に使用したVisual Studio 2013のプロジェクトファイル => Srcをダウンロード

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

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

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

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

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

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

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

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

※クラスのメンバ変数でループするメソッドを、シングルスレッドで実行するケースは、メソッド内の変数でループするメソッドを、シングルスレッドで実行した場合と、同じ結果になる事は明白なので実験していない。

 

コメント

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