c ++:我的单例线程安全的此getInstance方法安全吗?

问题描述

| 我目前正在尝试使用boost :: mutex编写一个线程安全的单例(至少在构造和破坏方面)。我读到boost互斥体不能静态初始化(抱歉,我丢失了阅读它的链接),所以如果构建和销毁的线程安全性为:
                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(我读到的内容)不安全? 编辑2: 嗯,这就是http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html上的链接     

解决方法

由于该函数的每个条目都会创建自己的锁,因此该锁将完全无用。任何数量的线程都可以进入该函数,锁定不同的锁,并同时开始处理静态数据。 您可以在文件(或类静态)范围内创建锁;前提是您没有在
main()
之前启动线程,这将确保它被及时创建。但是,即使在初始化静态数据之后,这也会序列化该函数的条目。 为什么不首先在文件(或类静态)范围内定义静态数据?     ,GCC提供静态变量的线程安全初始化。 因此,如果您使用GCC,则无需担心静态变量的正确初始化     ,您确实需要使用锁定。但是,您建议的“ 3”方案被破坏了,因为您在堆栈上分配了互斥锁,并且多个并发调用者将各自获得自己的互斥锁。