我正在阅读一篇有关“斯科特·迈耶斯(Scott Meyers)双重检查锁定的危险”的论文。 http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
作者给出了双重检查锁定失败的原因(第3页,第4节)。我在考虑不用C++ 11来解决此问题的方法。并不是我不想使用C++ 11,而只是看是否有可能不使用std::call_once等功能来解决它
class Singleton {
public:
static Singleton* instance();
private:
static Singleton* pInstance;
int someData_;
};
Singleton* Singleton::instance()
{
class SeqAssign{
public:
SeqAssign(Singleton*& pInst, Singleton* pNew):
pInstance(pInst), pNewedInst(pNew){
}
~SeqAssign(){
pInstance = pNewedInst;
}
private:
Singleton*& pInstance;
Singleton* pNewedInst;
};
if (pInstance == 0) { // 1st test
Lock lock;
if (pInstance == 0) { // 2nd test
SeqAssign seq(pInstance, new Singleton);
}
}
return pInstance;
}
Singleton::instance()中的代码是否将在多线程环境中工作,因为SeqAssign类的构造函数和析构函数的调用顺序是确定的。
最佳答案
否。可以从多个线程访问pInstance
变量。它
被修改。该代码具有未定义的行为。我不确定SeqAssign
会做的事情,因为它不会引入任何其他
线程间排序。
无法在标准C++中使双重检查日志记录工作。所有
的解决方案涉及原子变量(可能使用
内联汇编程序)或线程本地存储。
关于c++ - C++和双重检查锁定的风险:解决方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12348534/