构造函数在不同线程中的静态单例类上调用两次
Constructor called twice on static singleton class in different threads
我正在尝试实现一个必须在两个不同的线程中使用的单例类,一个设置其成员变量,另一个使用它们,但是构造函数被调用了两次,所以我无法使用第一个线程中设置的成员,因为它们具有默认值。
实现是非常标准的,一个静态函数,它返回对该函数中静态成员的引用,我尝试返回一个指针,创建一个原始指针并返回它,并且构造函数总是被调用两次。
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 标准保证静态局部变量只创建一次。这给我们留下了以下选择:
- 编译器不符合 C++11 标准。可能是因为它很旧或您使用了错误的选项。
- 您的单例引发(未捕获)异常,并且再次尝试初始化。
- 您的构造函数调用 getInstance(),这会导致未定义行为。
以上假设您已正确实现单一实例模式。你也可以以某种方式搞砸,但我无法判断,因为你没有提供完整的代码。
所有信息都取自静态局部变量的 cpp首选项。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- CEdit 框的NM_KILLFOCUS被调用两次
- 为什么这个构造函数被调用两次
- 析构函数在与 STL 的共享指针中调用两次
- 构造函数在不同线程中的静态单例类上调用两次
- 类析构函数在创建shared_ptr时调用两次
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- makefile 需要调用两次
- [c++]为什么我的类析构函数被调用两次?
- 为什么这个程序中的析构函数被调用两次
- 显式调用析构函数时被调用两次
- C++11 std::generate 和 std::uniform_real_distribution 调用两次会产生
- 基类函数被调用两次
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 为什么函子的 dtor 在作为函数的参数传递给线程时调用两次(多次)