Volatile Keyword对非C / C ++背景做了什么?

时间:2011-07-30 00:32:52

标签: c# .net multithreading

有人可以解释Volatile关键字用于...来自无C / C ++背景的人吗?

由于

5 个答案:

答案 0 :(得分:2)

如果你不是来自C / C ++背景,那么简单的答案就是不要使用volatile。

它的功能几乎取决于机器代码级别的实现。但从概念上讲,它告诉编译器变量的值可能在任何时间点发生变化。也许是由于操作系统,或者由于另一个线程。因此,每当需要访问该值时,请确保读取实际的内存位置,并且不要试图通过将其缓存在寄存器等中来使其变得可爱。

啊!只需注意C#标签。在这种情况下,它更多地与多线程和锁定(或不锁定)相比,而不是OS问题。除非你用不安全的代码做某事。

重新。 C#具体:

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

您希望在编写C#时,您可以忽略这些接近金属问题并继续开发构建良好的架构应用程序。

答案 1 :(得分:1)

它告诉编译器不要假设该值不会在变量声明的范围之外更改。这可以防止编译器根据此假设进行某些优化。当变量指向内存中正由硬件本身更新的地址时,通常会出现这种情况。

答案 2 :(得分:1)

它告诉编译器该字段可以从不同的线程更改,因此它不应该进行某些优化以防止更改显示。

例如,如果您在循环中读取变量,则编译器可以创建在循环外部读取变量并重用该值的代码。如果变量被标记为volatile,则编译器将不进行该优化,并且代码将在每次使用时读取变量。

答案 3 :(得分:0)

它用于多线程环境,您可以将其视为变量的标记,因此标记为volatile的变量的值将始终从主内存而不是缓存中读取或写入。

  

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

答案 4 :(得分:0)

在C#中,volatile关键字会导致对带有“volatile”MSIL前缀的字段进行读写操作。

易失性读取将导致CPU在引用内存开始执行的任何其他后续指令(在任何内核上)之前完全执行读取指令。

易失性写入将导致CPU等待,直到引用内存的所有前面的指令(在所有内核上)都已完成执行。

这有效地导致对易失性存储器位置的任何原子访问集都表现为 如果访问是同步的。这不需要自旋锁,或内核支持的关键部分的开销(基本上它内置在CPU /内存管理器硬件中)。