Volatile关键字为非C/ c++后台做什么?

本文关键字:后台 什么 c++ 关键字 Volatile | 更新日期: 2023-09-27 18:03:54

谁能解释一下Volatile关键字的用途是什么?对于没有C/c++背景的人来说?

谢谢

Volatile关键字为非C/ c++后台做什么?

如果你不是C/c++背景,简单的答案是不要使用volatile

它所做的在很大程度上依赖于机器代码级别的实现。但从概念上讲,它告诉编译器变量的值可能在任何时间点发生变化。可能是操作系统的原因,也可能是另一个线程的原因。因此,当需要访问该值时,请确保读取实际的内存位置,不要试图通过将其缓存到寄存器或类似的地方来进行可爱。

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

再保险。c#特别:

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

你可能希望在编写c#时可以忽略这些接近核心的问题,并继续开发架构良好的应用程序。

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

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

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

在c#中,volatile关键字导致对一个字段的读和写都带有"volatile" MSIL前缀。

volatile read将导致CPU在引用内存的任何后续指令开始执行之前完全执行读指令。

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

这有效地导致对易失性内存位置的任何一组原子访问行为为如果访问是同步的。这样做不需要自旋锁,也不需要内核支持的临界区的开销(基本上它是内置于CPU/内存管理器硬件中的)。

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

volatile关键字表示一个字段可能被同时执行的多个线程修改。声明为易失性的字段不受假设由单个线程访问的编译器优化的影响。这确保了在任何时候字段中都显示最新的值。MSDN