メソッド内で宣言されている変数はマルチスレッド間では共有されず、クラスのメンバ変数は共有される。 変数のスコープ仕様的に、whileループの中で宣言された変数が、その外側では使えないのと同じ。
以下、実験したソースと実行結果。
実験に使用したVisual Studio 2013のプロジェクトファイル => Srcをダウンロード
メソッド内の変数を使ってループするメソッドと、クラスのメンバ変数を使ってループするメソッド。これをシングルスレッド、マルチスレッドそれぞれで検証する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class CVariable実験1 { long mCnt = 0; // メソッド内の変数を使ってループするメソッド public void VariableTest1(object id) { string FileName = "result_" + id + ".txt"; if (File.Exists(FileName)) File.Delete(FileName); long iCnt = 0; string tmp = null; while (iCnt < 1000) { tmp = id + " " + iCnt.ToString() + "\r\n"; System.Diagnostics.Debug.WriteLine(tmp); File.AppendAllText(FileName, tmp); iCnt++; } } // クラスのメンバ変数を使ってループするメソッド public void VariableTest2(object id) { string FileName = "result_" + id + ".txt"; if (File.Exists(FileName)) File.Delete(FileName); string tmp = null; mCnt = 0; while (mCnt < 1000) { tmp = id + " " + mCnt.ToString() + "\r\n"; System.Diagnostics.Debug.WriteLine(tmp); File.AppendAllText(FileName, tmp); mCnt++; } } } |
1、メソッド内の変数でループするメソッドを、シングルスレッドで実行する。
1 2 3 4 5 6 7 |
private void 実証実験1() { var Variable実験 = new CVariable実験1(); Variable実験.VariableTest1("A"); } |
実行結果、result_A.txtファイルに1~999が出力される。
メソッド内で宣言されている変数は、マルチスレッド間で共有されない。
2、メソッド内の変数でループするメソッドを、マルチスレッドで実行する。
1 2 3 4 5 6 7 8 9 10 11 12 |
private void 実証実験2() { var Variable実験 = new CVariable実験1(); var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1)); var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1)); var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1)); i1.Start("A"); t2.Start("B"); t3.Start("C"); } |
実行結果、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。
メソッド内で宣言されている変数は、マルチスレッド間で共有されない。
3、クラスのメンバ変数でループするメソッドを、マルチスレッドで実行する。
1 2 3 4 5 6 7 8 9 10 11 12 |
private void 実証実験3() { var Variable実験 = new CVariable実験1(); var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2)); var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2)); var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2)); i1.Start("A"); t2.Start("B"); t3.Start("C"); } |
実行結果、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999が3分割された値が出力される。1ファイル辺り330行程度が出力される。
クラスのメンバ変数は、マルチスレッド間で共有される。
インスタンスを分ければ、クラスのメンバ変数も、マルチスレッド間で共有されなくなる。
※クラスのメンバ変数でループするメソッドを、シングルスレッドで実行するケースは、メソッド内の変数でループするメソッドを、シングルスレッドで実行した場合と、同じ結果になる事は明白なので実験していない。
コメント