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

标签 c++ boost singleton thread-safety

我目前正在尝试使用 boost::mutex 编写一个线程安全的单例(至少在构造和销毁方面)。我读到,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 一次会给我带来任何性能优势吗?

编辑: 好吧,我的第一个想法显然是不正确的。为了澄清问题。 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() 之前启动线程。但是,即使在初始化静态数据之后,这也会序列化函数的条目。

为什么不首先在文件(或类静态)范围内定义静态数据?

关于c++:我的单例的 getInstance() 方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6116520/

相关文章:

c++ - 向 Pimpl 类添加单例功能

javascript - 什么术语描述了使其易于测试的代码质量?

java - 有没有办法强制程序留在 RAM 中

c++ - Python 和 C++ 之间不寻常的速度差异

c++ - 是否可以在不复制的情况下从集合中提取元素?

c++ - 将指针从 C++ 传递到 Python/w boost python?

c++ - boost 文件系统 : recursive_directory_iterator constructor causes SIGTRAPS and debug problems

c++ - 就地更改 STL map 中的值

java - 如何使用工厂模式来获取数据库客户端的实例?

c++ - boost::spirit ,如何获取占位符的 "value"