假定有一个类来控制对(关键)代码块的并发访问,与此类似:

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

使用此类代码时,我是否需要使用volatile关键字才能
看不到代码被优化掉了吗?

例如,我必须写吗
ALockingObj LockObj;

void AFunc() {
    RAIIObj LKGuard( LockObj );

    // do some MT stuff
}

或者
ALockingObj LockObj;

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

    // do some MT stuff
}

为了确保LKGuard始终存在?

由于LKGuard是局部变量,在主体的任何位置都不会使用
如果不使用volatile关键字,可以优化功能吗?

谢谢

最佳答案

不,您不需要声明它为volatile。编译器可以看到,实例化lkobj可以完成很多无法优化的工作(与int lkobj;相对,后者显然什么也不做)

09-06 12:57