class foo {
public:
foo(int m):m_(m){}
~foo(){}
protected:
volatile int m_;
};
volatile的两个作用:
- 防止线程将变量拷贝搭配CPU的缓存中,这样保证CPU每次取值都去内存中取,保证多线程访问该数据的一致性;
- 防止编译器对操作该变量的指令进行优化调序,以免发生意想不到的事情。
另外,volatile
修饰指针时和const
一样,位置不同可能会构成不一样的类型,判断重载时,也需要考虑volatile:
void fun(int a, int* b) {}
void fun(int a, volatile int * volatile b) {}
int main() {
return 0;
}
编译可以通过,原因是产生的符号不同。