【问题标题】:Thread Safe singleton in C++ using static member instance (no lazy instantiation)C++ 中使用静态成员实例的线程安全单例(无延迟实例化)
【发布时间】:2016-01-14 16:35:06
【问题描述】:

我知道 Meyers 单例:

class Singleton{
private:
    Singleton();

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

它的优点是它使用惰性求值,但在 C++ 03 中不保证是线程安全的。

如果静态实例是成员变量怎么办?这保证是线程安全的吗?我不明白为什么不。此外,我愿意为此放弃惰性实例化。

class Singleton{
private:
    Singleton();
    static Singleton instance;

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

【问题讨论】:

标签: c++ multithreading thread-safety singleton


【解决方案1】:

如果您将单例实例更改为静态类成员,则该实例的创建将是线程安全的。不管你用它做什么,在很多情况下,意志仍然需要得到保护。

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

【讨论】:

    【解决方案2】:

    这完全击败了单例。是的,它变成了线程安全的。但是现在它与Singleton 类型的简单全局变量相同,那么为什么还要额外输入Instance() 和朋友呢?

    【讨论】:

      【解决方案3】:

      在获得线程安全的同时,您不会再挫败“静态初始化顺序惨败”,我认为这是此类 Singleton 类最重要的方面。

      【讨论】:

        猜你喜欢
        • 2011-01-13
        • 2017-10-25
        • 2011-04-11
        • 2020-07-12
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多