c#和C中volatile的区别

本文关键字:区别 volatile | 更新日期: 2023-09-27 18:04:15

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

c#和C中volatile的区别

Herb Sutter在这篇博文中简洁明了地解释了这些事情,并比较了volatile在C、c++、Java和c#中的用法和含义。

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

    如何说明c#中volatile关键字的用法C/c++/Java中volatile说明符的使用
  • "volatile"关键字的作用是什么?
  • c++ volatile多线程变量
  • volatile和多线程?
  • 为什么c中需要volatile ?

编辑:为了不让任何人感到困惑,这里是最初链接中提到的DDJ文章的"确切链接"(该链接指向Herb Sutter的博客)。

Nigel Jones的这篇文章还解释了嵌入式C编程环境中的volatile关键字。由于这个问题似乎是在采访中突然出现的,同一作者的另一篇文章是我最喜欢的文章之一("确切链接"),并且对C世界中的volatile有另一个很好的解释。

在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#规范更进一步:

  • 如果你写一个易失性变量,它可以保证你所做的所有内存访问完成。
  • 如果你从一个易失性变量中读取,可以保证在读取易失性变量之前,你在它之后做的所有内存访问都没有完成。