C#和C中挥发性的差异

时间:2011-08-03 07:46:36

标签: c# c

c#和c中的volatile有什么区别?我在一次采访中被问到这个问题。

2 个答案:

答案 0 :(得分:16)

Herb Sutter的

The article mentioned in this blog post简明扼要地解释了这些事情,并比较了C,C ++,Java和C#中volatile的用法和含义。

在这个网站上还有一些很好的问题和答案:

编辑:不要在这里混淆任何人是初始链接中提到的DDJ文章的“exact link”(这是Herb Sutter博客的链接)。

Nigel Jones的this article也解释了嵌入式C编程环境中的volatile关键字。由于这个问题似乎在一次采访中出现this other article同一位作者是我的最爱之一(“exact link”),并对C世界中的易变性有另一个很好的解释。

答案 1 :(得分:2)

在C volatile中告诉编译器不要优化对变量的访问:

int running = 1;
void run() {
    while (running) {
        // Do something, but 'running' is not used at all within the loop.
    }
}

通常编译器可能会将'while(running)'转换为'while(1)'。当'running'变量标记为volatile时,编译器每次都被强制检查变量。

重要的是要理解,对于C'volatile'仅限制编译器进行优化,而您的硬件(即CPU缓存,指令管道等)仍可能重新排序内存访问。您的C编译器无法告诉您的硬件不进行优化。你必须自己做(例如使用内存屏障)。

据我所知(但我不完全确定)C#规范更进一步:

  • 如果您写入volatile变量,则保证在完成之前执行的所有内存访问。
  • 如果从易失性变量中读取,则可以保证在完成易失性变量读取之前未完成的所有内存访问。