比較的古典的なマルチスレッド学習コード。
1. マルチスレッド同期問題が使用されます。
2. マルチスレッドの順序問題を使用します。
興味がある場合は、以下のコードをよく読んでください。コードセグメントの順序に注意して、これらのコードの順序を入れ替えることができるかどうか考えてみましょう。これは学習に役立つはずです。デモンストレーションの目的で、すべてのスレッドをしばらくスリープさせます。
System.Net を使用する。
システムを使用する;
System.IO を使用します。
System.Text を使用します。
System.Threading を使用します。
System.Diagnostics
名前空間 Webb.Study
を使用します。
{
クラステストスレッド
{
静的ミューテックス m_Mutex = new Mutex();
静的 Thread[] m_testThreads = 新しいスレッド [10];
静的 int m_threadIndex = 0;
静的 void ThreadCallBack()
{
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("スレッド {0} 開始。",m_index);
for(int i=0;i<=10;i++)
{
TestThread.m_Mutex.WaitOne();
Console.WriteLine("スレッド {0}: が実行中です。{1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
スレッド.スリープ(100);
}
Console.WriteLine("スレッド {0} が終了しました。",m_index);
public static void Main(String[] args
)
{
Console.WriteLine("メインスレッドの開始");
for(int i=0;i
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = 新しいスレッド(新しい ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
スレッド.スリープ(100);
}
for(int i=0;i
TestThread.m_testThreads[i].Join();
}
Console.WriteLine("メインスレッドを終了します。");
}
}
}
1. main 関数内のこれら 2 つの文は交換できますか?なぜ?
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. CallBack 関数内のこれら 2 つの文は置き換えることができますか?なぜ?異なる結果は何でしょうか?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. main 関数は次のように記述できますか?なぜ?異なる結果は何でしょうか?
public static void Main(String[] args)
{
Console.WriteLine("メインスレッドの開始");
for(int i=0;i
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = 新しいスレッド(新しい ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
TestThread.m_testThreads[i].Join();
スレッド.スリープ(100);
}
Console.WriteLine("メインスレッドを終了します。");
}
4. これらの文の役割は何ですか?では、このプログラムにはどのような問題がまだ残っているのでしょうか?どのような変更を加えるべきでしょうか?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
学習とディスカッション専用。