zoukankan      html  css  js  c++  java
  • CLR via C# 读书笔记 21 编译器优化导致的问题

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

  • 相关阅读:
    inotify+rsync做实时同步
    JAVA序列化和反序列化
    初识iBatis
    《Spring in action》之高级装配
    《Spring in action》之装配Bean
    原根
    数论知识
    线性(欧拉)筛
    Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E DNA Evolution
    Fibonacci
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/1877926.html
Copyright © 2011-2022 走看看