まず、デザイン モードでシングルトン モードを使用して、オブジェクトの複数の初期化が発生し、アクセス スペースに不整合が生じるのを防ぎます。
カウントの精度を確保するには、カウント ポイントにロックを追加して、他のスレッドのカウントを一時的にブロックする必要があります。
リアルタイムにカウントと出力を行いたい場合は、カウントと出力を同時にロックすることができます。そうしないと、異なるスレッドのカウントと出力結果が順番に処理されない可能性があります。
この方法でロックすると、順次処理と順次出力が保証されますが、パフォーマンスが多少低下します。
コード内のロックの位置は非常に重要です
このプログラムでは 3 つの操作を追加します。理由は、このスレッドが 200 回に達していないためですが、初めて追加されるスレッドがあるはずなので、追加で判断します。
次のようにコードをコピーします。
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <概要>
/// スレッド作業
/// </概要>
パブリック void DoSomeWork()
{
///表示文字列を構築する
文字列結果 = "";
///Sigleton インスタンスを作成する
System.Threading.Thread.Sleep(100);
int i = 0;
while (MyCounter.GetCounter() < 200)
{
// カウントが出力と一致していることを確認します。カウントと出力の間に時間間隔が追加された場合でも、この領域は他のスレッドが動作しないようにロックされます。
ロック(これ)
{
///カウントを開始する
MyCounter.Add();
System.Threading.Thread.Sleep(100);
スレッド thread = Thread.CurrentThread;
結果 += "スレッド";
results += i++.ToString() + "――>" + thread.Name + " ";
結果 += "現在の数:";
結果 += MyCounter.GetCounter().ToString();
結果 += "/n";
Console.WriteLine(結果);
// 表示文字列をクリア
結果 = "";
}
}
}
public void StartMain()
{
スレッド thread0 = Thread.CurrentThread;
thread0.Name = "スレッド 0";
スレッド thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "スレッド 1";
スレッド thread2 =new Thread(new ThreadStart(DoSomeWork));
thread2.Name = "スレッド 2";
スレッド thread3 =new Thread(new ThreadStart(DoSomeWork));
thread3.Name = "スレッド 3";
thread1.Start();
thread2.Start();
thread3.Start();
///スレッド 0 は他のスレッドと同じ作業のみを実行します
DoSomeWork();
}
}