linux下pthread_once_t的单例模式,代码如下:
#include<iostream>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
template<typename T>
class Singleton{
public:
static T *getInstance() {
cout<<"getInstance()"<<endl;
pthread_once(&_once, &Singleton::init);
return _instance;
}
private:
static pthread_once_t _once;
static void init(){
cout<<"init()"<<endl;
_instance = new T();
}
static T *_instance;
Singleton() = delete;
~Singleton() = delete;
Singleton(const Singleton &) = delete;
};
template<typename T>
pthread_once_t Singleton<T>::_once = PTHREAD_ONCE_INIT;
template<typename T>
T* Singleton<T>::_instance = NULL;
class Factory
{
public:
Factory(){cout<<"Factory()"<<endl;};
//friend class Singleton<Factory>;
void printHello(){std::cout << "hello factory!!!" << std::endl;}
private:
//Factory(){};
Factory(Factory &f) = delete;
void operator=(Factory &f) = delete;
};
int main()
{
Factory * f1 = Singleton<Factory>::getInstance();
Factory * f2 = Singleton<Factory>::getInstance();
Factory * f3 = Singleton<Factory>::getInstance();
printf("f1: %p\n", f1);
printf("f2: %p\n", f2);
printf("f3: %p\n", f3);
f1->printHello();
return 0;
}