C ++中使用静态成员实例的线程安全单例(无延迟实例化)

时间:2016-01-14 16:35:07

标签: c++ multithreading thread-safety singleton

我知道迈耶斯单身人士:

order.suborders.uniq.inspect

它的优点是它使用延迟评估,但不保证在C ++ 03中是线程安全的。

如果静态实例是成员变量怎么办?这是否保证是线程安全的?我不明白为什么不。而且我愿意放弃懒惰的实例。

class Singleton{
private:
    Singleton();

public:
    Singleton & GetInstance(){
        static Singleton instance;
        return instance;
    }
}

3 个答案:

答案 0 :(得分:2)

如果将单例实例更改为静态类成员,则该实例的创建将是线程安全的。无论你用它做什么,在许多情况下仍然需要保护原因。

另见When are static C++ class members initialized?

答案 1 :(得分:1)

这完全击败了单身人士。是的,它变得线程安全。但是现在它与Singleton类型的全局变量相同,那么为什么要对Instance()和朋友进行额外输入?

答案 2 :(得分:1)

虽然你获得了线程安全性,但你并没有打败"静态初始化命令惨败"更多,这在我看来是这种类型的Singleton类最重要的方面。