188得票9回答
为什么在多线程的C或C++编程中,volatile不被认为是有用的?

正如我最近发布的这个答案中所展示的,我似乎对在多线程编程环境下使用volatile的效用(或缺乏效用)感到困惑。 我的理解是:只要一个变量可能在访问它的代码流之外被改变,那么该变量应该声明为volatile。 信号处理程序、I/O寄存器以及被另一个线程修改的变量都构成了这样的情况。 因此,...

173得票6回答
易失性与原子性的区别。

我在某个地方读到了以下内容。 Java中的volatile关键字并不意味着具有原子性,这是一个常见的误解, 在声明为volatile后,使用 ++ 操作仍然不是原子操作,在Java中需要使用synchronized方法或块确保独占访问以使其成为原子操作。 那么如果两个线程同时...

172得票5回答
何时在多线程中使用volatile?

如果有两个线程访问一个全局变量,很多教程都会建议将该变量声明为 volatile,以防止编译器将该变量缓存在寄存器中,导致变量没有正确更新。 然而,如果两个线程都访问一个共享变量,这时需要通过互斥锁进行保护,不是吗? 但在这种情况下,在线程锁定和释放互斥锁之间的代码处于临界区,只有该线程才...

139得票8回答
“volatile”关键字用于什么?

我读了一些关于 volatile 关键字的文章,但是我无法弄清楚它的正确用法。 请告诉我在 C#和 Java 中应该如何使用它?

129得票4回答
易失性变量是否昂贵?

阅读完编译器编写者的JSR-133食谱,特别是关于volatile实现的“与原子指令的交互”一节后,我认为在不更新volatile变量的情况下读取它需要LoadLoad或LoadStore障碍。在页面的下面,我看到LoadLoad和LoadStore在X86 CPU上实际上是无操作的。这是否意...

95得票3回答
一个指向volatile的指针,如“volatile int * p”,有什么用处?

volatile用于告诉编译器不要对引用进行优化,以便每次读/写都不使用寄存器中存储的值,而是进行实际的内存访问。我可以理解它对某些普通变量很有用,但不理解volatile如何影响指针。volatile int *p = some_addr; int a = *p; // CPU always...

93得票6回答
C++中的volatile和mutable有什么区别?

我有一个关于volatile和mutable的差异问题。我注意到两者都表示它们可能会改变。除此之外还有什么?它们是同样的东西吗?它们的区别在哪里?它们适用于哪些情况?为什么提出这两个想法?如何以不同方式使用它们? 非常感谢。

92得票8回答
在.NET中双重检查锁定中需要使用volatile修饰符的原因

多个文本表示,在.NET中实现双重检查锁定时,应该对要锁定的字段应用volatile修饰符。但为什么呢?请考虑以下示例:public sealed class Singleton { private static volatile Singleton instance; priva...

91得票7回答
在Java中,何时使用volatile关键字?

我读过 "Java中何时使用'volatile'?"但仍感到困惑。我如何知道何时应将变量标记为volatile?如果我弄错了,要么省略了某个需要它的volatile,要么将volatile放在不需要的东西上怎么办?在多线程代码中确定哪些变量应该是volatile时有什么经验法则?

90得票13回答
C++中的volatile关键字是否引入了内存屏障?

我了解到,volatile 告诉编译器该值可能会被更改,但为了实现这个功能,编译器需要引入 memory fence 吗? 根据我的理解,对 volatile 对象的操作顺序不能被重新排序,必须保留。这似乎意味着一些 memory fences 是必要的,并且没有什么办法可以避免这种情况。我...