问题标签 [volatile]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6071 浏览

c++ - “volatile”限定符和编译器重新排序

编译器无法消除或重新排序对volatile-qualified 变量的读/写。

但是在其他变量存在的情况下,可能是也可能不是- 限定的volatile呢?

方案 1

编译器可以重新排序第一个和第二个,或者第三个和第四个赋值吗?

方案 2

同样的问题,编译器可以重新排序第一个和第二个,还是第三个和第四个赋值?

0 投票
6 回答
2324 浏览

c++ - 线程同步 101

以前我写过一些非常简单的多线程代码,而且我一直都知道,在我正在做的事情中,任何时候都可能会发生上下文切换,所以我一直保护通过共享变量的访问一个 CCriticalSection 类,它进入构造的关键部分并使其处于破坏状态。我知道这是相当激进的,我经常进入和离开关键部分,有时甚至非常严重(例如,在函数开始时,我可以将 CCriticalSection 放在更紧凑的代码块中)但我的代码没有崩溃并且运行速度足够快.

在工作中,我的多线程代码需要更紧密,只需在所需的最低级别锁定/同步。

在工作中我试图调试一些多线程代码,我遇到了这个:

现在,m_bSomeVariable是一个 Win32 BOOL(非易失性),据我所知,它被定义为一个 int,并且在 x86 上读取和写入这些值是一条指令,并且由于上下文切换发生在指令边界上,所以没有必要用于将此操作与关键部分同步。

我在网上做了一些研究,看看这个操作是否不需要同步,我想出了两个场景:

  1. CPU 实现乱序执行或者第二个线程在不同的内核上运行,并且更新的值没有写入 RAM 以供其他内核查看;和
  2. int 不是 4 字节对齐的。

我相信数字 1 可以使用“volatile”关键字来解决。在 VS2005 及更高版本中,C++ 编译器使用内存屏障围绕访问此变量,确保在使用之前始终将变量完全写入/读取到主系统内存。

数字 2 我无法验证,我不知道为什么字节对齐会产生影响。我不知道 x86 指令集,但是否mov需要给定一个 4 字节对齐的地址?如果不需要,您是否需要使用指令组合?那会引入问题。

所以...

问题 1:使用“volatile”关键字(隐式使用内存屏障并提示编译器不要优化此代码)是否使程序员无需在读取 / 之间同步 x86/x64 变量上的 4 字节/8 字节写操作?

问题 2:是否有明确要求变量是 4 字节/8 字节对齐的?

我对我们的代码和类中定义的变量做了更多的研究:

现在,对我来说,这似乎太过分了。我认为关键部分在进程之间同步线程,所以如果你有一个你可以输入它并且该进程中没有其他线程可以执行。对于您要保护的每个变量,不需要一个临界区,如果您处于临界区,那么没有其他东西可以打断您。

我认为唯一可以从关键部分外部更改变量的是进程是否与另一个进程共享内存页面(你可以这样做吗?)并且另一个进程开始更改值。互斥体在这里也有帮助,命名互斥体是跨进程共享的,还是只有同名的进程?

问题 3:我对关键部分的分析是否正确,是否应该重写此代码以使用互斥锁?我看过其他同步对象(信号量和自旋锁),它们更适合这里吗?

问题 4:关键部分/互斥体/信号量/自旋锁最适合哪里?也就是说,它们应该应用于哪个同步问题。选择一个而不是另一个会带来巨大的性能损失吗?

在我们讨论的过程中,我读到自旋锁不应该在单核多线程环境中使用,只能在多核多线程环境中使用。所以,问题 5:这是错的,或者如果不是,为什么是对的?

提前感谢您的任何回复:)

0 投票
6 回答
413 浏览

java - !不同!之间的总订单!易变的变量?

考虑以下 Java 代码:

如果 volatile 访问有一个全局可见的总顺序,那么总是会达到至少一个 println。

Java 标准是否真的保证了这一点?或者这样的执行是否可能:

我只能在标准中找到关于访问同一volatile 变量的语句(但我可能会遗漏一些东西)。

“对 volatile 变量(第 8.3.1.4 节)v 的写入与任何线程对 v 的所有后续读取同步(其中后续是根据同步顺序定义的)。”

http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4

谢谢!

0 投票
1 回答
334 浏览

c - armcc 是否使用 -O0 优化非易失性变量?

我应该在使用 armcc 编译器和 -O0 优化时*Register声明吗?volatile

换句话说:-O0 优化是否需要将这类变量限定为volatile?(这可能在 -O2 优化中是必需的)

0 投票
6 回答
1567 浏览

java - 使用 volatile 关键字

据我了解,如果我们将变量声明为 volatile,那么它将不会存储在本地缓存中。每当线程更新值时,它都会更新到主内存。因此,其他线程可以访问更新的值。

但在下面的程序中,易失性和非易失性变量都显示相同的值。

不为第二个线程更新 volatile 变量。谁能解释一下为什么 testValue 没有改变。


0 投票
2 回答
1023 浏览

c# - .NET 多线程、易失性和内存模型

假设我们有以下代码:

是错!主要问题是为什么......我想CPU重新排序操作 flag1 = true; 和 if(flag2) 语句,但变量 flag1 和 flag2 标记为易失性字段...

0 投票
1 回答
4514 浏览

java - Java:VolatileImage 比 BufferedImage 慢

我正在用 Java 制作游戏,并使用 BufferedImages 将内容呈现到屏幕上。我在应该运行游戏的低端机器上遇到性能问题,所以我切换到通常更快的 VolatileImage。除了他们实际上减慢了整个事情的速度。

图像是使用 GraphicsConfiguration.createCompatibleVolatileImage(...) 创建的,并使用Graphics.drawImage (...) 绘制到屏幕上(点击链接查看具体是哪一个)。它们使用双缓冲绘制在画布上。

有人知道这里出了什么问题吗?

0 投票
2 回答
740 浏览

c++ - 在用户模式线程中使用 volatile 变量是否安全?

我不太确定在用户模式线程中旋转 volatile 变量是否安全,以实现轻量级 spin_lock,我查看了 tbb 源代码,tbb_machine.h:170,

正如我所见, atomic_backoff 类中没有栅栏。而从其他用户模式的 spin_lock 实现中,它们中的大多数使用 CAS(比较和交换)。

0 投票
2 回答
3039 浏览

java - volatile实际上是如何工作的?

像在 Java 中那样标记变量volatile可确保每个线程都看到上次写入它的值,而不是某个陈旧的值。我想知道这实际上是如何实现的。JVM 是否发出特殊指令来刷新 CPU 现金或其他什么?

0 投票
7 回答
3987 浏览

c++ - C++ 中的“伪原子”操作

所以我知道在 C++ 中没有什么是原子的。但我试图弄清楚我是否可以做出任何“伪原子”假设。原因是我想避免在一些只需要非常弱的保证的简单情况下使用互斥锁。

1)假设我已经全局定义了 volatile bool b,最初我设置为 true。然后我启动一个执行循环的线程

同时,在另一个线程中,我执行 b=true。

我可以假设第一个线程将继续执行吗?换句话说,如果 b 开始为真,并且第一个线程在第二个线程分配 b=true 的同时检查 b 的值,我可以假设第一个线程将 b 的值读取为真吗?或者是否有可能在赋值 b=true 的某个中间点,b 的值可能被读取为 false?

2) 现在假设 b 最初为假。然后第一个线程执行

而第二个线程执行 b=true。我可以假设 bad() 永远不会被调用吗?

3) int 或其他内置类型怎么样:假设我有 volatile int i,它最初是(比如说)7,然后我分配 i=7。我可以假设在此操作期间的任何时间,从任何线程,i 的值都将等于 7?

4)我有volatile int i=7,然后我从某个线程执行i++,所有其他线程只读取i的值。我可以假设我在任何线程中都没有任何价值,除了 7 或 8?

5) 我有 volatile int i,我从一个线程执行 i=7,从另一个线程执行 i=8。之后,我是否保证是 7 或 8(或者我选择分配的任何两个值)?