假定有一个类来控制对(关键)代码块的并发访问,与此类似:
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;
相对,后者显然什么也不做)