单一实例对象是否通过线程安全返回shared_ptr

Is Singleton object returned through shared_ptr thread-safe?

本文关键字:返回 安全 shared ptr 线程 实例 对象 是否 单一      更新时间:2023-10-16

我正在阅读问题的答案。C++ 单例设计模式

其中一个答案建议使用 shared_ptr 来保证多个静态对象访问单一实例对象时的生存期。我注意到这里的shared_ptr是使用 new 构造的,并且是按值返回的。

将 new 用于shared_ptr构造原子/thread_safe吗?

我的第二个困惑是关于RVO。我尝试在我的实现中创建两个单例对象。

shared_ptr显示三个_Uses和一个_Weak。我预计_Uses数是两个。优化在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;
}

将 new 用于shared_ptr构造原子/thread_safe吗?

是的,创建shared_ptr是线程安全的,因为static初始化是线程安全的(另请参阅此问题(

shared_ptr显示三个_Uses和一个_Weak。我预计_Uses数是两个。优化在Visual Studio 15.5.6上完全完成。RVO 在这里不起作用吗?

您的使用计数为 3,因为shared_ptr被声明为 static ,这意味着当它初始化时,将创建对象,因此使用计数增加 1 (+2 对于主中的两个shared_ptr(。此使用计数仅在销毁static shared_ptr时再次减少,并且在程序终止时发生这种情况。