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

Constructor called twice on static singleton class in different threads

本文关键字:调用 两次 单例类 静态 线程 构造函数      更新时间:2023-10-16

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

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

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) 创建的

我预计实例的构造函数仅在我第一次调用此函数时被调用,但第二次实例具有不同的内存方向。

C++11 标准保证静态局部变量只创建一次。这给我们留下了以下选择:

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

以上假设您已正确实现单一实例模式。你也可以以某种方式搞砸,但我无法判断,因为你没有提供完整的代码。

所有信息都取自静态局部变量的 cpp首选项。