c++ - 从多线程中获取单例实例的安全方法

标签 c++ multithreading

方法一

DataCenter* DataCenter::getInstance()
{
    static DataCenter instance;
    return &instance;    
}

方法二

DataCenter* DataCenter::getInstance()
{
    if (!m_instanceFlag)
    {
        m_instance = new DataCenter();
        m_instanceFlag = true;
    }    
    return m_instance;      
}

我正在从事多线程编程,DataCenter 将被多个线程访问。我曾经使用方法 2 来获取 DataCenter 的实例并且它工作正常。但是我注意到我需要保护单例实例不被多线程调用。

我的问题首先是我真的需要保护单例实例吗?或者操作系统会为我做这个吗?第二个问题是,第一种方法是获取单例实例的正确方法吗?

提前致谢...

最佳答案

1.你确实需要保护它,即使你不这样做,当然操作系统也不会为你做。使用以下代码实现线程安全:

DataCenter* DataCenter::getInstance()
{
    MutexLocker locker(DataCenter::m_mutex);
    if(!m_instanceFlag)
    {
        m_instance = new DataCenter();
        m_instanceFlag = true;
    }
    return m_instance;
}

编辑:

MutexLocker 是这样的:

class MutexLocker
{
    pthread_mutex_t &mutex;
    public:
    MutexLocker(pthread_mutex_t &mutex):mutex(mutex)
    {
        if(pthread_mutex_lock(&this->mutex)!=0)
            throw std::runtime_error("mutex locking filed");
    }
    ~MutexLocker(void)
    {
        if(pthread_mutex_unlock(&this->mutex)!=0)
            throw std::runtime_error("mutex unlocking filed");
    }
}

2.第一种方法看起来没问题,但不是线程安全的。

关于c++ - 从多线程中获取单例实例的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620348/

相关文章:

C++ 将类的 this 指针分配给 unique_ptr 或 shared_ptr

c++ - 改进 OpenCV 中的 Grabcut

android - RxJava2如何观察UDP数据包?

c++ - 标准 C++ 中的共享递归互斥锁

java - 何时使用线程、中断和连接

c++ - 需要一个虚拟模板成员解决方法

C++ : Creating 1-d array which contains the elements from 3-d array

c++ - 如何理解对象被销毁了?

c++ - 从另一个非进程和日志堆栈发送信号到线程没有发生

java - jbutton 请求并发无响应