C++ 实现单例模式 多线程
2012-10-31 11:01
169 查看
/article/4635916.html
//Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <iostream>
#include <pthread.h>
using namespace std;
class locker
{
public:
inline locker(){ pthread_mutex_init(&mutex,NULL);}
inline ~locker(){ pthread_mutex_destroy(&mutex);}
inline void lock(){ pthread_mutex_lock(&mutex);}
inline void unlock(){ pthread_mutex_unlock(&mutex);}
private:
pthread_mutex_t mutex;
};
class Singleton
{
public:
static Singleton* Instance();
private:
Singleton();
static Singleton * m_pInstance;
class Garbo//删除Singleton实例的对象
{
public:
~Garbo()
{
if(Singleton::m_pInstance)
{
delete Singleton::m_pInstance;
}
}
};
static Garbo gb;//在程序结束时,系统会调用它的析构函数
};
#endif //~_SINGLETON_H_
//Singleton.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::m_pInstance = 0;
Singleton::Singleton()
{
cout<<"Singleton...."<<endl;
}
Singleton* Singleton::Instance()
{
if(NULL == m_pInstance)
{
locker llock;
llock.lock();
if(NULL == m_pInstance)
{
m_pInstance = new Singleton();
}
llock.unlock();
}
return m_pInstance;
}
//main.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Singleton* sgn = Singleton::Instance();
return 0;
}
将构造函数声明为private,防止被实例化。用一个静态成员变量和静态函数实现唯一的对象构造。在静态函数中new了空间,所以用内嵌的成员对象的析构函数来释放内存。为了多线程安全,在建对象之前先加锁,完成后拆锁。
//Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <iostream>
#include <pthread.h>
using namespace std;
class locker
{
public:
inline locker(){ pthread_mutex_init(&mutex,NULL);}
inline ~locker(){ pthread_mutex_destroy(&mutex);}
inline void lock(){ pthread_mutex_lock(&mutex);}
inline void unlock(){ pthread_mutex_unlock(&mutex);}
private:
pthread_mutex_t mutex;
};
class Singleton
{
public:
static Singleton* Instance();
private:
Singleton();
static Singleton * m_pInstance;
class Garbo//删除Singleton实例的对象
{
public:
~Garbo()
{
if(Singleton::m_pInstance)
{
delete Singleton::m_pInstance;
}
}
};
static Garbo gb;//在程序结束时,系统会调用它的析构函数
};
#endif //~_SINGLETON_H_
//Singleton.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::m_pInstance = 0;
Singleton::Singleton()
{
cout<<"Singleton...."<<endl;
}
Singleton* Singleton::Instance()
{
if(NULL == m_pInstance)
{
locker llock;
llock.lock();
if(NULL == m_pInstance)
{
m_pInstance = new Singleton();
}
llock.unlock();
}
return m_pInstance;
}
//main.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Singleton* sgn = Singleton::Instance();
return 0;
}
将构造函数声明为private,防止被实例化。用一个静态成员变量和静态函数实现唯一的对象构造。在静态函数中new了空间,所以用内嵌的成员对象的析构函数来释放内存。为了多线程安全,在建对象之前先加锁,完成后拆锁。
相关文章推荐
- 【转】单例模式 C++实现 多线程安全
- c++多线程单例模式实现
- C++实现多线程安全的单体模式(Singleton)
- C++实现多线程安全的单例模式
- 通过例子学设计模式之--单例模式以及多线程下说明(C++实现)
- C++实现多线程安全的单例模式 已测试
- C++实现多线程安全的单例模式
- 设计模式C++实现(5)——原型模式、模板方法模式
- 外观模式C++实现
- 设计模式C++实现(6)——建造者模式
- 设计模式C++实现——工厂模式
- C++中利用多线程实现定时器
- 设计模式---建造者模式(C++实现)
- 单例模式——C++实现自动释放单例类的实例
- 命令模式----C++实现
- C++实现代理模式
- 设计模式C++实现(16)——状态模式
- java多线程(2)-实现生产者/消费者模式
- 设计模式C++实现——装饰者模式
- 设计模式C++实现--原型模式、模板方法模式