繁体   English   中英

c++:这是我的 singleton 线程安全的 getInstance() 方法吗?

[英]c++: is this getInstance() method of my singleton threadsafe?

我目前正在尝试使用 boost::mutex 编写线程安全的 singleton(至少在构造和销毁方面)。 我读到 boost mutex 无法静态初始化(我丢失了我阅读它的链接,抱歉)所以为了解决这个问题,我尝试了这个,如果构造和销毁的线程安全是:

                static T& getInstance()
            {
#ifndef STATIC_VARIABLES_ARE_THREADSAFE
                boost::mutex mutex; 
                boost::lock_guard lock(mutex);
#endif
                static T instance;
                return instance;
            }

那是线程安全的,还是我应该使用 boost::call_once? 与这种方法相比,提升一次会给我带来任何性能优势吗?

编辑:好的,我的第一个想法显然是不正确的。 澄清问题。 boost::mutex 可以安全地静态初始化吗? 像这样:

class Singleton
{
private:
static boost::mutex m_mutex;

public:
static Singleton & getInstance()
{
    boost::lock_guard lock(m_mutex);
    static T instance;
    return instance;
}

};

这是一种可行的方法,还是静态初始化 boost::mutex 实际上不安全(这是我读到的)?

EDIT2 :啊,那是链接http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html

由于 function 的每个条目都会创建自己的锁,因此锁将完全无用; 任意数量的线程都可以进入function,锁不同的锁,同时开始搞乱static数据。

您可以在文件(或 class 静态)scope 处创建锁; 这将确保它及时创建,前提是您不在main()之前启动线程。 但是,即使在 static 数据初始化之后,这也会序列化 function 的条目。

为什么不首先在文件(或 class 静态)scope 中定义您的 static 数据?

GCC 提供 static 变量的线程安全初始化。 所以,如果你使用 GCC 你不需要关心 static 变量的正确初始化

尝试使用 Meyers Singleton 实现。

class MySingleton {
public:
  static MySingleton& getInstance() {
    static MySingleton instance;
    return instance;
  }
private:
  MySingleton();
  ~MySingleton();
  MySingleton(const MySingleton&)= delete;
  MySingleton& operator=(const MySingleton&)= delete;

};

MySingleton::MySingleton()= default;
MySingleton::~MySingleton()= default;


// Usage
int main() {
  MySingleton::getInstance();
}

更多信息...

您确实需要使用锁定。 但是,您提出的boost::mutex方案被破坏了,因为您在堆栈上分配了互斥锁,并且多个并发调用者将各自获得自己的互斥锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM