以下是一个完整的单例模式实现code.为了保证单例模式创建的object可以被自动释放而不依靠程序员主动去释放,我们在singleTon实现了一个内部类freeSingleTon.我们知道,当程序结束后,所有的全局变量和static变量都会被析构掉。freeSingleTon的唯一目的就是利用这个特性来对单例模式的object进行析构。
#include <iostream>
#include <pthread.h>
using namespace std;
class singleTon{
public:
static singleTon* getInstance(){
if(pInstance ==NULL) {
pthread_mutex_lock(&lock);
if(pInstance ==NULL){
pInstance = new singleTon();
}
pthread_mutex_unlock(&lock);
}
return pInstance;
}
void setVal(int i) {
a = i;
}
int getVal(){
return a;
}
~singleTon(){
cout <<"singleTon deconstructor is called" << endl;
}
class freeSingleTon{
public:
freeSingleTon(){
cout <<"freeSingleTon constructor is called" << endl;
}
~freeSingleTon(){
cout <<"freeSingleTon deconstructor is called" << endl;
if(singleTon::pInstance){
delete singleTon::pInstance;
}
}
};
private:
int a;
static singleTon* pInstance;
static freeSingleTon f;
static pthread_mutex_t lock;;
singleTon(){
a = 0;
cout << "singleTon constructor is called" << endl;
}
singleTon(const singleTon&);
singleTon & operator = (const singleTon&);
};
singleTon* singleTon::pInstance = NULL;
singleTon::freeSingleTon singleTon::f;
pthread_mutex_t singleTon::lock = PTHREAD_MUTEX_INITIALIZER;;
pthread_mutex_t print_mutex = PTHREAD_MUTEX_INITIALIZER;
void*
thread_routine(void* arg){
singleTon * p = singleTon::getInstance();
pthread_mutex_lock(&print_mutex);
cout << "thread id: " << pthread_self() <<", field a of singleTon is " << p->getVal() << endl;
pthread_mutex_unlock(&print_mutex);
}
int main(){
pthread_t tid[3];
singleTon * p1 = singleTon::getInstance();
p1->setVal(5);
int i;
for(i =0; i < 3; i++) {
pthread_create(&tid[i], NULL, thread_routine, &i);
}
for(i =0; i < 3; i++) {
pthread_join(tid[i], NULL);
}
return0;
}
output:
freeSingleTon constructor is called
singleTon constructor is called
thread id: 140453118928640, field a of singleTon is 5
thread id: 140453108438784, field a of singleTon is 5
thread id: 140453097948928, field a of singleTon is 5
freeSingleTon deconstructor is called
singleTon deconstructor is called