class MyClass
{
int x, y;
void foo() volatile {
// do stuff with x
// do stuff with y
}
};
我是否需要将x和y声明为volatile,或者将所有成员变量自动视为volatile?
我希望确保编译器不会将"stuff with x“与"stuff with y”一起重新排序。
编辑:如果我将普通类型转换为volatile类型,会发生什么?这是否会指示编译器不对该位置的访问进行重新排序?我想在特殊情况下将一个普通变量传递给一个参数是
和对非易失性int的影响是否与常规读取和赋值对带有修饰符的int具有相同的效果?
其动机是防止volatile变量不应通过ref参数传递给方法的警告。(我知道尽管有警告,但程序是正确的,但我不想在代码中留下神秘的语用。)
//private volatile int suppressListChangedEvents;
private int suppressListChangedEvents;
public void SuppressListChangedEvents()
{
Interlocked.Increment(ref suppressListChangedEvents);
我用下面的代码得到了下面的错误。我试图找出谷歌的问题所在,但我没有找到任何有用的东西。
Compiling /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c
In file included from /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c:1:0:
/home/tectu/projects/resources/chibios/ext/lcd/touchpad.h:17:1: warning: useless type qualifier in empt
假设我有以下定义:
/* Generic structure of entire SFR area for each UART module */
typedef struct tagUART {
unsigned int uxmode;
unsigned int uxsta;
unsigned int uxtxreg;
unsigned int uxrxreg;
unsigned int uxbrg;
} UART, *PUART;
/* SFR blocks for each UART module */
我最近开始研究核心Java中的多线程。我正在研究一个易失性关键字。据我所知,允许线程在本地保存变量的值。如果变量驱动任何逻辑(例如循环),那么对变量的更改将对线程不可见,它们将继续使用过期的缓存值,除非变量声明为“volatile”。
我创建了一个小代码来演示这一点,然而,我的观察是不同的。即使共享变量'done‘不是易失性的,一个线程(主线程)所做的更改对另一个线程也是非常可见的。有没有人能帮我理解一下这个行为
package com.test;
public class App implements Runnable {
private boolean done= tru
根据我从和读到的内容,您可能认为volatile和并发编程是完全正交的概念,至少就C/C++而言是这样。
然而,在GCC的中,std::atomic的所有成员函数都有volatile限定符,在安东尼·威廉姆斯的 of std::atomic中也是如此。
那么,我的atomic<>变量是否需要为volatile呢?
volatile是告诉编译器不要优化引用,这样每次读/写都不会使用存储在寄存器中的值,而是进行真正的内存访问。我可以理解它对一些普通变量很有用,但不理解volatile是如何影响指针的。
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
如果声明为int *p = some_addr,有什么区别?