C#和C中volatile的区别

12

在C#和C中,volatile有什么区别?我在一次面试中被问到了这个问题。

2个回答

16

Herb Sutter在这篇博客文章中简明清晰地解释了volatile在C、C++、Java和C#中的用法和含义,并进行了比较。

这个网站上也有一些关于此话题的好问题和答案:

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

此外,Nigel Jones的这篇文章解释了嵌入式C编程中volatile关键字的含义。由于这个问题似乎在面试中出现过,同一作者的另一篇文章是我最喜欢的之一(精确链接),其中也对C语言中的volatile进行了很好的解释。


通过您提供的链接,我无法理解其中的区别。 - Luis Filipe
1
@Luis Filipe 你到底没有理解什么?简单总结一下这篇文章的内容:在Java/.NET(C#)中,volatile用于无锁编程,而在C/C++中,它用于描述“异常内存语义”(描述HW寄存器、多个地址的内存)。 - celavek
你必须跟进实际的ddj文章。不知道是否容易链接(广告)。 - H H
@celavek 感谢您的解释。我意识到我的不理解是由于我对这个主题的无知。我会在有时间的时候学习它。 - Luis Filipe
@Luis Filipe,我在评论中没有使用轻蔑的语言,只是想从你那里获取更多信息,以便理解误解出现的原因。如果您提供有关哪些部分不容易理解的详细信息,也许我或其他更有经验的人可以帮助您。 - celavek
@celavek 我并没有将其理解为贬义。我真诚地认为最好的方法是在有时间时阅读相关内容,然后如果仍有疑问,我会寻求社区帮助。再次感谢。 - Luis Filipe

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 变量,则保证在其之前执行的所有内存访问都已完成。 - 如果您从一个 volatile 变量中读取,则保证在读取 volatile 变量之后执行的所有内存访问都尚未完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接