Questions tagged «volatile»

易失性是用于定义“可以自行更改”的数据存储区域(对象,字段,变量,参数)的限定符,因此无法进行某些代码生成器优化。在某些但不是全部识别该限定符的语言中,对此类数据的访问是线程安全的。

22
volatile关键字对
今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我发现了以下解释: Java理论与实践:管理波动 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾经遇到过可以正确使用该关键字的情况?

9
易失性,连锁性与锁定
假设一个类具有一个public int counter可由多个线程访问的字段。这int仅递增或递减。 要增加此字段,应使用哪种方法,为什么? lock(this.locker) this.counter++;, Interlocked.Increment(ref this.counter);, 将的访问修饰符更改counter为public volatile。 现在我已经发现volatile,我已经删除了许多lock语句和对的使用Interlocked。但是,有理由不这样做吗?


7
atomic / volatile / synchronized有什么区别?
原子/易失性/同步在内部如何工作? 以下代码块之间有什么区别? 代码1 private int counter; public int getNextUniqueIndex() { return counter++; } 代码2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } 代码3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } 是否volatile以以下方式工作?是 volatile int i = 0; void incIBy5() { i += 5; } 相当于 …



4
Java中的volatile和Synchronized之间的区别
我想知道将变量声明为as volatile和始终synchronized(this)在Java块中访问变量之间的区别吗? 根据本文http://www.javamex.com/tutorials/synchronization_volatile.shtml可以说很多,有很多区别,但也有一些相似之处。 我对这段信息特别感兴趣: ... 访问volatile变量永远不会阻塞:我们只做简单的读取或写入操作,因此与同步块不同,我们永远不会保持任何锁; 因为访问易失性变量永远不会持有锁,所以它不适用于我们希望以原子操作方式进行读写更新的情况(除非我们准备“错过更新”); 读-更新-写是什么意思?写不仅是更新,还是仅表示更新是取决于读取的写? 最重要的是,何时声明变量volatile而不是通过synchronized块访问变量更合适?volatile对依赖于输入的变量使用它是一个好主意吗?例如,有一个称为的变量render可以通过渲染循环读取并由keypress事件设置吗?


9
为什么在多线程C或C ++编程中不认为volatile有用?
正如我最近发布的答案所表明的那样,我似乎对volatile多线程编程上下文中的实用程序(或缺少实用程序)感到困惑。 我的理解是:只要变量可以在访问代码的控制流之外更改,则该变量应声明为volatile。信号处理程序,I / O寄存器以及由另一个线程修改的变量都构成了这种情况。 因此,如果您有一个全局int foo,并且foo被一个线程读取,并由另一个线程自动设置(可能使用适当的机器指令),则读取线程会以这种方式看到这种情况,就像看到一个由信号处理程序或由外部硬件条件修改,因此foo应声明volatile(或在多线程情况下,以内存限制的负载访问,这可能是一个更好的解决方案)。 我怎么在哪里错?

8
“ volatile”关键字的作用是什么?
Наэтотвопросестьответына 堆栈溢出нарусском:Ключевоеслово挥发性в的Java 我阅读了一些有关该volatile关键字的文章,但无法弄清楚其正确用法。您能否告诉我在C#和Java中应该使用什么?
130 c#  java  volatile 

5
何时在多线程中使用volatile?
如果有两个线程访问全局变量,那么许多教程都说要使变量可变,以防止编译器将变量缓存在寄存器中,从而导致无法正确更新。但是,两个都访问共享变量的线程需要通过互斥锁进行保护,不是吗?但是在那种情况下,在线程锁定和释放互斥锁之间,代码处于关键部分,其中只有一个线程可以访问该变量,在这种情况下,变量不需要是可变的? 因此,多线程程序中volatile的用途/目的是什么?

4
挥发物贵吗?
在阅读了有关volatile的实现的JSR-133编译器厨师手册之后,尤其是“与原子指令的交互”部分,我认为读取volatile变量而不更新它需要LoadLoad或LoadStore屏障。在页面的下方,我看到在X86 CPU上,LoadLoad和LoadStore实际上是无操作的。这是否意味着无需在x86上显式地使缓存无效就可以进行volatile读操作,并且它与普通变量读取一样快(不考虑volatile的重新排序约束)? 我相信我无法正确理解。有人可以启发我吗? 编辑:我想知道在多处理器环境中是否存在差异。如John V.所述,在单CPU系统上,CPU可能会查看其自己的线程缓存,但是在多CPU系统上,必须为CPU提供一些配置选项,这还不够,必须命中主内存,从而使volatile速度变慢在多CP​​U系统上,对吗? PS:在学习更多相关信息的过程中,我偶然发现了以下精彩文章,由于这个问题可能会让其他人感兴趣,因此我将在这里分享我的链接: Java理论与实践:修复Java内存模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分

6
说明C#中volatile关键字的用法
我想编写一个小程序,以可视方式说明volatile关键字的行为。理想情况下,它应该是对非易失性静态字段执行并发访问并因此而获得错误行为的程序。 在同一程序中添加volatile关键字应该可以解决此问题。 那是我无法实现的。即使尝试几次,启用优化等,我也总是得到正确的行为而没有'volatile'关键字。 您对此主题有任何想法吗?您知道如何在简单的演示应用程序中模拟此类问题吗?它取决于硬件吗?
88 c#  .net  volatile 

6
C ++中的volatile与可变
我对volatile和mutable之间的区别有疑问。我注意到两者都意味着可以对其进行更改。还有什么?它们是一样的吗?有什么不同?它们在哪里适用?为什么提出这两个想法?如何以不同方式使用它们? 非常感谢。
85 c++  volatile  mutable 

13
C ++ volatile关键字是否引入了内存屏障?
我了解这会volatile告知编译器该值可能会更改,但是为了完成此功能,编译器是否需要引入内存隔离墙以使其起作用? 据我了解,对易失对象的操作顺序不能重新排序,必须保留。这似乎意味着需要一些内存隔离,并且实际上没有解决方法。我说的对吗? 有关这个问题有一个有趣的讨论 乔纳森·韦克利(Jonathan Wakely)写道: ...对不同的volatile变量的访问,只要它们出现在单独的完整表达式中,就无法重新排序...对,volatile对于线程安全性是无用的,但并非出于其给出的原因。这不是因为编译器可能会重新排列对易失性对象的访问,而是因为CPU可能会重新排列对易失性对象的访问。原子操作和内存屏障可防止编译器和CPU重新排序 到大卫·施瓦茨回答的评论: 从C ++标准的角度来看,在编译器执行某些操作和编译器发出导致硬件执行某些操作的指令之间没有区别。如果CPU可以重新排序对易失性的访问,则该标准不需要保留其顺序。... ... C ++标准对重新排序没有任何区别。而且您不能说CPU可以对它们进行重新排序而不会产生可观察的效果,所以没关系-C ++标准将它们的顺序定义为可观察的。如果编译器生成使平台执行标准要求的代码,则它符合平台上的C ++标准。如果该标准要求对挥发物的访问不进行重新排序,那么重新排序它们的平台将不兼容。... 我的观点是,如果C ++标准禁止编译器对不同的volatile进行重新排序,那么从理论上讲,此类访问的顺序是程序可观察到的行为的一部分,那么它还要求编译器发出禁止CPU执行的代码所以。该标准没有区分编译器做什么和编译器生成的代码使CPU做什么。 哪个产生两个问题:它们中的一个是“正确的”吗?实际的实现实际上是做什么的?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.