通过 shared_ptr 返回的 Singleton 对象是线程安全的吗?
Is Singleton object returned through shared_ptr thread-safe?
我正在阅读问题的答案。 C++ Singleton design pattern
其中一个answer建议使用shared_ptr来保证多个静态对象访问单例对象时的生命周期。我注意到这里的shared_ptr是用new构造的,按值返回。
正在使用新的 shared_ptr 构造 atomic/thread_safe?
我的第二个困惑是关于 RVO。我尝试在我的实现中创建两个单例对象。
shared_ptr 显示三个 _Uses 和一个 _Weak。我预计 _Uses 计数为 2。 Visual Studio 15.5.6 的优化已完成。
RVO 在这里不起作用吗?
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static std::shared_ptr<Singleton> instance()
{
static std::shared_ptr<Singleton> s{new Singleton};
return s;
}
~Singleton() {}
private:
Singleton() {}
};
int main()
{
std::shared_ptr<Singleton> obj1 = Singleton::instance();
std::shared_ptr<Singleton> obj2 = Singleton::instance();
return 0;
}
Is using new for shared_ptr construction atomic/thread_safe?
是的,shared_ptr
的创建是线程安全的,因为 static
初始化是线程安全的(另请参阅 this question)
The shared_ptr shows three _Uses and one _Weak. I expected _Uses count to be two. Optimization is full on Visual Studio 15.5.6. Is RVO not functioning here?
您的使用次数为三,因为 shared_ptr
被声明为 static
,这意味着当它被初始化时,对象被创建,因此使用次数增加一(+ 2 用于主要的两个 shared_ptr
)。当 static shared_ptr
被销毁时,此使用计数只会再次减少,并且当程序终止时会发生这种情况。
我正在阅读问题的答案。 C++ Singleton design pattern
其中一个answer建议使用shared_ptr来保证多个静态对象访问单例对象时的生命周期。我注意到这里的shared_ptr是用new构造的,按值返回。
正在使用新的 shared_ptr 构造 atomic/thread_safe?
我的第二个困惑是关于 RVO。我尝试在我的实现中创建两个单例对象。
shared_ptr 显示三个 _Uses 和一个 _Weak。我预计 _Uses 计数为 2。 Visual Studio 15.5.6 的优化已完成。 RVO 在这里不起作用吗?
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static std::shared_ptr<Singleton> instance()
{
static std::shared_ptr<Singleton> s{new Singleton};
return s;
}
~Singleton() {}
private:
Singleton() {}
};
int main()
{
std::shared_ptr<Singleton> obj1 = Singleton::instance();
std::shared_ptr<Singleton> obj2 = Singleton::instance();
return 0;
}
Is using new for shared_ptr construction atomic/thread_safe?
是的,shared_ptr
的创建是线程安全的,因为 static
初始化是线程安全的(另请参阅 this question)
The shared_ptr shows three _Uses and one _Weak. I expected _Uses count to be two. Optimization is full on Visual Studio 15.5.6. Is RVO not functioning here?
您的使用次数为三,因为 shared_ptr
被声明为 static
,这意味着当它被初始化时,对象被创建,因此使用次数增加一(+ 2 用于主要的两个 shared_ptr
)。当 static shared_ptr
被销毁时,此使用计数只会再次减少,并且当程序终止时会发生这种情况。