在看有关volatile的说明的时候,老是看有人拿下面这个例子来说明,对没有volatile修饰的变量来说,新线和可能只会读取寄存器或者cache的值我看了太多的介绍volatile的文章,都会举以下代码的例子,说在vs选择发布模式时,Worker方法中的while循环不会退出,以此来说明volatile的必要性但实际,我做了很多次试验,VS是选择发布模式,然后运行EXE,但是并不是像所说的,while循环在过了2秒后还是会退出
我不知道有些人在发博文的时候到底有没有自己亲自测试过这个问题
有什么办法可以印证这个问题吗?,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadDemo2
{
    class Program
    {
        private static bool flag;
        static void Main(string[] args)
        {
            Thread th = new Thread(Worker);
            th.Start();
            Thread.Sleep(2000);
            flag = true;
            Console.WriteLine("flag became true!");
            Console.Read();
        }
        static void Worker()
        {
            while (!flag)
            {
            }
            Console.WriteLine("Done");
        }
    }
}

解决方案 »

  1.   

    while循环在过了2秒后会退出。
    http://msdn.microsoft.com/zh-cn/library/x13ttww7.aspx
      

  2.   

    要在属性中设置一下,在build选项卡中,选择x86平台,然后选中代码优化选项。再试一下。
      

  3.   

    楼上统统没有回答正确!!稍后我告诉楼主为什么哈哈这段代码确实是这样的。。在我这里运行也不成功这和flag是静态变量有关系,事实上编译器的优化条件是很苛刻的。我这里有段代码。。楼主可以试试。。using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Threading;namespace TJJTEST
    {
        class Program
        {        static void Main(string[] args)
            {
                test t = new test();
                t.Main();
               // t = null;
                Console.ReadKey();
            }
           
        }    public class test
        {
            private bool flag = false;
            public void Main()
            {
                Thread th = new Thread(Worker);
                th.Start();
                Thread.Sleep(2000);
                flag = true;
                Console.WriteLine("flag became true!");
               
                //Console.ReadKey();
            }         void Worker()
            {
                flag = false;
                while (!flag)
                {
                }
                Console.WriteLine("Done");
            }
        }
      

  4.   

    继续。。回复。。当楼主吧worker下面的flag=false注释掉,那么就不会成功。。也说明不了   private volatile bool flag = false;的重要性。。编译器在线程编译的时候只有在flag在该线程被设定了值,并且从未对其再次赋值,才会对其进行相应的嵌入优化,无论是 volatie还是static都会破坏编译器的这种优化,所以。。楼主贴出来的。。广泛流传的代码就是错的。童鞋们可以把volatie换成static试试嘿嘿。。结果很美妙。
      

  5.   

    上面说的还是有点偏了不是嵌入优化的事情额。。还是看代码吧。。这种情况也会成功。         void Worker()
            {
                flag = false;
                while (!flag)
                {
                }
                flag = true;
                Console.WriteLine("Done");
            }