volatile关键字和RAII习语(C++)

Mik*_*tor 4 c++ raii volatile

假设有一个类来控制与这个类似的(关键)代码块的并发访问:

class RAIIObj : public boost::noncopyable {
public:
    explicit RAIIObj( LockObj& Obj ) : LkObj( Obj ) { Obj.Acquire(); }
    ~RAIIObj() { try { Obj.Release(); } catch (...) {} }
private:
    LockObj& LkObj;
};
Run Code Online (Sandbox Code Playgroud)

使用这样的代码时,我是否需要使用volatile关键字才能看到代码被优化掉?

例如,我必须写

ALockingObj LockObj;

void AFunc() {
    RAIIObj LKGuard( LockObj );

    // do some MT stuff
}
Run Code Online (Sandbox Code Playgroud)

要么

ALockingObj LockObj;

void AFunc() {
    volatile RAIIObj LKGuard( LockObj );

    // do some MT stuff
}
Run Code Online (Sandbox Code Playgroud)

为了确保LKGuard始终存在?

由于LKGuard是一个局部变量,在函数体的任何一点都没有使用,如果我不使用volatile关键字,可以优化掉吗?

谢谢

pm1*_*100 6

不,你不需要声明它不稳定.编译器可以看到实例化lkobj做了一大堆不能优化的东西(相反,int lkobj;它显然什么都不做)