作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
方法一
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/
我是一名优秀的程序员,十分优秀!