现在的位置: 首页 > 综合 > 正文

CLR via C# 读书笔记 2-1 编译器优化导致的问题

2012年06月25日 ⁄ 综合 ⁄ 共 763字 ⁄ 字号 评论关闭

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) ...  这句话

 

抱歉!评论已关闭.