デバッグ&リリースモードでこの現象が発生した理由を知りたいと思います。このコードはリリースモードでハングアップしますが、デバッグモードで正常に動作します
public static void Main(string[] args)
{
bool isComplete = false;
var t = new Thread(() =>
{
int i = 0;
while (!isComplete) i += 0;
});
t.Start();
Thread.Sleep(500);
isComplete = true;
t.Join();
Console.WriteLine("complete!");
}
動作の違いはなんですか? –
これは厄介です。 'i'がラムダの外側で宣言されていれば、コードはデバッグとリリースモードで正常に動作しますが、ラムダ本体の中で宣言されていれば、リリースモードでコードがハングします。一部の最適化が間違っていますか? – InBetween
もしそれがjavaなら、コンパイラは 'コンパイル'変数への更新を見ないと思うでしょう。変数宣言に 'volatile'を追加するとそれが修正され、静的フィールドになります。 – Sebastian