我正在阅读一篇有关“斯科特·迈耶斯(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/

10-10 22:17