CLR via C# 讀書筆記 2-1 編譯器優化導致的問題
DotNet項目在Debug 和Release 模式一個主要的差別就是有沒有打開編譯器優化
在release下由于采用了編輯器優化,那么原來有些運行正常的代碼就會出問題
下面一段代碼就是這樣
internal static class StrangeBehavior
{
// As you'll see later, mark this field as volatile to fix the problem
private static Boolean s_stopWorker = false;
public static void Main()
{
Console.WriteLine("Main: letting worker run for 5 seconds");
Thread t = new Thread(Worker);
t.Start();
Thread.Sleep(5000);
s_stopWorker = true;
Console.WriteLine("Main: waiting for worker to stop");
t.Join();
}
private static void Worker(Object o)
{
Int32 x = 0;
while (!s_stopWorker) x++;
Console.WriteLine("Worker: stopped when x={0}", x);
}
}
在Debug模式編譯運行 你會發現程序正常的結束了
在Release模式編譯運行 你會發現程序進入了死循環 , 在while 那條語句
這是由于編譯器在優化模式下會認為s_stopWorker是一個常量(非true即false)
當s_stopWorker為false的時候, 編譯器認為永遠是while(true) 就進入了死循環
但s_stopWorker為true的時候,編輯器會直接忽略掉 while(!s_stopWorker) ... 這句話
浙公網安備 33010602011771號