构造函数在不同线程的静态单例类上调用了两次

时间:2019-01-28 09:08:00

标签: c++ multithreading singleton

我试图实现一个必须在两个不同线程中使用的单例类,一个设置其成员变量,另一个使用它们,但是构造函数被调用了两次,所以我不能使用第一个线程,因为它们具有默认值。

实现是相当标准的,一个静态函数返回对该函数中静态成员的引用,我试图返回一个指针,创建一个原始指针并返回它,并且构造函数始终被调用两次。

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

    // public methods

private:
    Singleton();
    Singleton(const Singleton &) = delete;
    Singleton(Singleton &&) = delete;
    Singleton &operator=(const Singleton &) = delete;
    Singleton &operator=(Singleton &&) = delete;

    // member variables
};

尝试访问单例的线程已使用std :: async(std :: launch :: async,lambda)创建

我希望第一次调用该函数时会调用实例的构造函数,但是第二次实例具有不同的内存方向。

1 个答案:

答案 0 :(得分:0)

C ++ 11标准保证静态局部变量仅创建一次。 这为我们提供了以下选项:

  1. 您的编译器不符合C ++ 11。可能是因为它旧了或 您使用了错误的选项。
  2. 您的Singleton引发(未捕获)异常,并且 再次尝试初始化。
  3. 您的构造函数调用getInstance(),导致未定义 行为。

以上假设您已经实现了Singleton模式correctly。您也可能以某种方式搞砸了,但我不能告诉您,因为您没有提供完整的代码。

取自cppreference on static local variables.

的所有信息