代码之家  ›  专栏  ›  技术社区  ›  Zain Shaikh

“volatile”关键字在C中的用途是什么#

  •  17
  • Zain Shaikh  · 技术社区  · 14 年前

    volatile C#中的关键字?

    我看到了下面的陈述,但我不明白为什么 不稳定的

    internal volatile string UserName; 
    
    6 回复  |  直到 12 年前
        1
  •  29
  •   Eric Lippert    14 年前

    请参阅本规范第10.5.3节,其中规定:

    对于非易失性领域,优化 会导致意外和 不可预测的结果 没有同步的字段,例如 由lock语句提供的 由编译器执行,由 运行时系统,或硬件。为了 易变字段,这样的重新排序 优化受到限制:

    一个 读取易失性字段称为 获得语义;也就是说,它是 保证在任何 对之后发生的内存的引用 它在指令序列中。

    一个 易失性写入。不稳定的写操作 发布语义;也就是说 写作前的参考文献 指令中的指令 顺序。

    所有线程都将看到volatile 按照它们的顺序 不需要提供一个 易失性写入的总顺序为

    非常小心 如果你有任何想要制造一个不稳定场的意图。如果你没有 彻底彻底地

        2
  •  7
  •   w.donahue    14 年前

    Volatile用于一个变量,该变量在代码运行时可以在不执行任何操作的情况下进行更改。它告诉编译器以这样一种方式编写程序集,这样就永远不会缓存变量,而是在每次使用之前确保读取它。

    易失性的一个例子是一个硬件寄存器,您的代码有内存映射,并且正在读取该寄存器以确定何时设置标志。硬件可以在代码运行时设置该值,如果不使用volatile关键字,则不会注意到此更改,因为程序集永远不会实际检查该值。

        3
  •  6
  •   Franci Penov    14 年前

    请考虑以下代码:

    If (UserName == "")
        // do something
    If (UserName == "Fred")
        // do something
    

    如果volatile不存在,编译器可能会生成IL,在其中它将引用存储在堆栈上,用于第一次比较,而不是在第二次比较中重用它。但是,添加volatile会告诉编译器引用可能被另一个线程更改,从而迫使它生成不会重用第一次比较的堆栈副本的IL。

        4
  •  4
  •   Joel Coehoorn    14 年前

    “volatile关键字表示一个字段可能被同时执行的多个线程修改。声明为volatile的字段不受编译器优化的约束,编译器优化假定由单个线程访问。这可确保始终在字段中显示最新的值。”

    http://msdn.microsoft.com/en-us/library/x13ttww7(v=VS.100).aspx

        5
  •  3
  •   heisenberg    14 年前

    它表示该值可能由不同的线程更改,因此需要读取该值,即使以前的指令已读取该值。

    http://msdn.microsoft.com/en-us/library/x13ttww7%28VS.71%29.aspx

        6
  •  2
  •   Singleton    14 年前

    会随时通过任何方式改变它的价值 编译器不应对此变量做任何假设。

    通常编译器会假设某些变量 重复注册器值。因为寄存器值可能 被任何东西改变。所以对于这些变量 应该声明为“volatile”,并且每次都要检查 出现在代码中,没有任何假设。