我写了一个单例类,使用了双重检查锁定的方法,确保只有一个类实例生成。
其中我使用mutex,从而实现锁定方法。
如果我想把mutex换成spinlock,我该怎么写?求一份比较详细的代码。。。
(单纯的替换mutex->spinlock好像会报编译错误。
另外,顺便问下,把mutex换成spinlock在Singleton模式下会有比较大的性能提升么?(目测不会。。。= =。。
我的代码如下:
#ifndef SINGLETON
#define SINGLETON
class CSingleton
{
public:
static CSingleton* getInstance()
{
if(!uniqueInstance)
{
pthread_mutex_lock(&mutex);
if(!uniqueInstance)
{
uniqueInstance = new CSingleton();
}
pthread_mutex_unlock(&mutex);
}
return uniqueInstance;
}
void fill(int x){ val += x; }
int getVal(){ return val; }
private:
int val;
CSingleton()
{
val = 0;
}
CSingleton(const CSingleton&){}
CSingleton & operator = (const CSingleton&);
static CSingleton * uniqueInstance;
static pthread_mutex_t mutex;
};
CSingleton * CSingleton::uniqueInstance = NULL;
pthread_mutex_t CSingleton::mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
新的 C++11 标准增加了 2 种单例的写法
1 static 变量是线程安全的
T& getInstance ()
{
static T instance;
return instance;
}
2 使用 std::call_once,他保证了函数只会调用一次
全选复制放进笔记std::once_flag flag;
T* instance;
T* getInstance ()
{
std::call_once(flag, [instance]()
{
instance = new T;
});
return instance;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。