修飾子「volatile」に関するMicrosoftMSDNリファレンスページを見ていましたが、それらが提供するスニペットがスレッドの実行を完了するのを待つ方法について少し確信が持てませんでした。
これは単なるサンプルコードであり、スレッドは非常に迅速に完了したことを私は知っていますが、以下のコードは、スレッドを理解しようとしている開発者にとってはあまり良くないと思います。
マイクロソフトは実際に、コードに「タイトループ」を導入するコードスニペットを提示したと思います。このコードスニペットには(それほど)影響はないことを理解していますが、開発者がこのコードを取得して、もう少し集中的なマルチスレッドコードに使用しようとすると、「タイトループ」と見なされます。問題が発生しますか?
using System;
using System.Threading;
class Test
{
public static int result;
public static volatile bool finished;
static void Thread2() {
result = 143;
finished = true;
}
static void Main() {
finished = false;
// Run Thread2() in a new thread
new Thread(new ThreadStart(Thread2)).Start();
// Wait for Thread2 to signal that it has a result by setting
// finished to true.
for (;;) {
if (finished) {
Console.WriteLine("result = {0}", result);
return;
}
}
}
}
スニペットリファレンス: http ://msdn.microsoft.com/en-gb/library/aa645755(v = vs.71).aspx
上記の例で、この「タイトループ」状況を引き起こさないスレッドが終了するのを待つためのより良い方法は何でしょうか?
それとも、「タイトループ」は実際にはまったく導入されないのでしょうか。
スニペットの目的は「volatile」キーワードを示すことであるため、Thread.Join()を使用すると、スニペットがコンテキストから外れることに注意してください。