单例
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
既然是单例,因此我们不能够通过1.构造函数、2.拷贝构造函数和3.赋值运算符重载的方式实例化这个类,因此,我们需要:
1.把1,2,3统统声明成private的
2.Singleton类里声明一个静态指针,指向该类的实例
3.在getInstance()生成单例时,用new,生成在堆区,后序可以动态删除
#include<stdio.h>
#include<pthread.h>
#include<cstdlib>
#include <iostream>
using namespace std;
pthread_mutex_t mutex;
pthread_mutex_t mutex1;
const int NUM_THREADS = 100;
class Singleton{
public:
static Singleton* getInstance(){
if(instance==NULL){
pthread_mutex_lock(&mutex);
if(instance==NULL) {
instance = new Singleton();
cout<<"new a singleton"<<endl;
}
pthread_mutex_unlock(&mutex);
}
return instance;
}
static void destory(){
if(instance){
pthread_mutex_lock(&mutex1);
if(instance) {
delete instance;
cout<<"destory singleton"<<endl;
}
pthread_mutex_unlock(&mutex1);
}
}
private:
Singleton(){
}
//把复制构造函数和=操作符也设为私有,防止被复制
Singleton(const Singleton&){}
Singleton& operator=(const Singleton&){}
virtual ~Singleton(){
}
static Singleton* instance;
//static pthread_mutex_t mutex;
};
Singleton* Singleton::instance = NULL;
void* run(void* arg){
uint64_t i=*(uint64_t*)arg;
Singleton* singleton1 = Singleton::getInstance();
//singleton1->destory();
cout<<i<<endl;
}
int main() {
pthread_t thread;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_mutex_init(&mutex,NULL);
pthread_mutex_init(&mutex1,NULL);
for(uint64_t i=0;i<NUM_THREADS;++i){
pthread_create(&thread,&attr,run,&i);
//
}
//Singleton* singleton1 = Singleton::getInstance();
//Singleton* singleton2 = Singleton::getInstance();
//if (singleton1 == singleton2)
// fprintf(stderr,"singleton1 = singleton2\n");
pthread_join(thread,NULL);
return 0;
}