首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >volatile关键字用法

volatile关键字用法
EN

Stack Overflow用户
提问于 2013-07-01 11:04:57
回答 3查看 226关注 0票数 2

我正在尝试理解volatile关键字的用法,所以我写了一个小例子,我想使用Volatile关键字,但目前我得到了相同的行为,要么我使用Volatile关键字,要么我不使用它。

下面是我正在运行的代码,我希望即使t1正在更新ExitLoop属性,线程t2也会继续执行

代码语言:javascript
复制
namespace UsageOfVolatileKeyword
{
    class Program
    {
        static void Main()
        {
            Test t = new Test();

            Thread t2 = new Thread(() => { while (!t.ExitLoop) { Console.WriteLine("In loop"); } });
            t2.Start();

    Thread t1 = new Thread(() => t.ExitLoop = true);
            t1.Start();

            t2.Join();

            Console.WriteLine("I am done");

            Console.ReadLine();
        }
    }

    class Test
    {
        private bool _exitLoop = false; //I am marking this variable as volatile.

        public bool ExitLoop
        {
            get { return _exitLoop; }
            set { _exitLoop = value; }
        }
    }
}

如果有人能帮助我理解我做错了什么,以及Volatile关键字的正确用法是什么,那就太好了。

EN

回答 3

Stack Overflow用户

发布于 2013-07-01 11:28:12

在较高的级别上,volatile是编译器“不对此变量的状态做任何假设”的标记。从本质上讲,您可以使用它来指示多线程或计算机本身的一部分可能正在更改此内存位置。例如,您可以将某些内容映射到串行端口上的UART数据寄存器。当你读取这个变量时,它的值是硬件中的任何值。

如果你不告诉编译器这个变量是易失性的,它可能会假设如果你将它设置为true,然后在代码中的某个地方使用它,那么这个变量仍然是true,并使用一些常量折叠逻辑来优化代码。

票数 3
EN

Stack Overflow用户

发布于 2013-07-01 11:27:05

你推荐过http://msdn.microsoft.com/en-us/library/x13ttww7(v=vs.71).aspx了吗?

变量,以根据最近的CPU指令获取非缓存值,并且在编译过程中不进行编译器优化。

在你的例子中,我认为CPU做了有效的上下文切换,并且标志是一致的(带/出标志)。我认为当有许多多线程并且cpu正在进行切换时,我们可以看到一些不同之处

您还可以参考c中提到的关于OS级内部结构的线程Why is volatile needed in C?

票数 1
EN

Stack Overflow用户

发布于 2013-07-12 23:25:45

之所以没有观察到差异,是因为在这个特定的场景中,Console.WriteLine已经生成了一个内存屏障,使得volatile变得冗余。同样重要的是,您应该使用发布版本来执行这类测试,并在不附加调试器的情况下运行应用程序。请看我的答案herehere,尤其是here,以获取有关如何重现此内容的示例和解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17396912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档