【发布时间】:2018-08-09 09:28:33
【问题描述】:
我正在使用 C++ 11,我遇到了一个带有 volatile 成员变量的类,这引发了一个问题:
问题一:
如果在一个类函数中设置成员变量并在另一个类函数中轮询 - 是否需要 volatile?如果有,什么时候? (我知道如果 x 映射到硬件寄存器我们应该使用 volatile,我的意思是“纯软件”场景)
例子:
class MyClass
{
public:
FuncA { if (x==5) print("hello"); }
FuncB { x=5;}
private:
volatile int x = 0;
}
不同的线程正在访问MyClass实例,但没有2个线程同时访问,所以不需要保护x。
问题 2:
是否存在调用FuncB后FuncA不打印“hello”的场景(某种优化)?
【问题讨论】:
-
对于您的情况,有 std::atomic。
-
您需要一个minimal reproducible example 来说明“同时没有2 个线程”的意思
-
如果行为由于某些优化而改变,您将导致未定义的行为。所以你真正应该问的是,这是明确定义的
-
volatile在 C++ 中是一个被极度误解的关键字。我已经关闭了“重复链”的开始,因为他们应该向您解释这一切。不过,赞成这个问题:它很好地呈现和有用。 -
看看这个讨论 atomic 和 volatile 之间区别的问题:stackoverflow.com/questions/8819095/…