【发布时间】:2015-02-02 22:35:41
【问题描述】:
假设有一个类来控制对与此类似的(关键)代码块的并发访问:
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 关键字,可以优化掉这个函数吗?
谢谢
【问题讨论】:
-
我认为只有一两个实例可以优化构造函数/析构函数对,例如RVO。否则我不会担心的。
-
感谢您的澄清。问候