gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:37:51 25 4
gpt4 key购买 nike

方法一

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com