2011-07-30 43 views
1

有人可以解释什么Volatile关键字用于......来自一个没有C/C++背景的人?Volatile关键字对于非C/C++背景有什么作用?

感谢

+0

你问关于C#或C/C++吗?答案可能不同。 – JohnFx

+0

这是哪一种语言? –

+0

可能的重复[什么时候应该在C#中使用volatile关键字?](http://stackoverflow.com/questions/72275/when-should-the-volatile-keyword-be-used-in-c) – JohnFx

回答

2

如果从C/C++背景简单的答案是不使用挥发性不是。

它在机器代码级别执行的相当多的实现。但从概念上讲,它告诉编译器,变量的值在任何时候都可能发生变化。也许是由于操作系统,或由于另一个线程。因此,无论何时需要访问该值,都要确保读取实际的内存位置,并且不要试图通过将其缓存在寄存器或类似内容中而变得可爱。

啊!只需注意C#标签。在这种情况下,多线程和锁定(或不锁定)与操作系统问题有关。除非你正在做一些不安全的代码。

Re。 C#尤其是:

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

你会希望编写C#时,你可以忽略这些类型的接近金属的问题和与开发良好架构的应用程序得到。

+0

了解它......谢谢。 – Marco

0

它在多线程环境中使用,你可以把它看成是一个标志变量,因此该变量与挥发性总是会读取或从主存储器而不是高速缓存写入标记的价值。

volatile关键字指示一个字段可能被同时执行的多个线程修改。声明为volatile的字段不受受单个线程访问的编译器优化的限制。这确保了最新的值始终存在于现场。 MSDN

1

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

1

它告诉该字段可以从不同的线程被改变,因此,它不应该做一定的优化,将继续改变从显示出来的编译器。

比如你看一个循环内的变量,编译器可以创建代码,外循环一次读取变量并重新使用该值。如果该变量被标记为volatile,那么编译器将不会进行优化,并且代码将在每次使用该变量时读取该变量。

0

在C#,挥发性关键字原因读取和向其写入的字段与“挥发性” MSIL前缀发射。

挥发性读取将导致CPU之前引用存储器开始执行任何其他后续指令(在任何核心)完全执行的读取指令。

挥发性写入将导致CPU等待,直到引用存储器所有的先行指令(在所有核)已经完成执行。

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