原文 http://blog.chinaunix.net/u2/88024/showart_1713422.html
**************************************************************
#ifndef SINGLETON_H
#define SINGLETON_H
#include <pthread.h>
template< class T >
class Singleton
{
class InstanceHolder
{
public:
InstanceHolder() : mObject(0) {}
~InstanceHolder() { delete mObject; }
T* get() { return mObject; }
void set(T* p) { delete mObject; mObject = p; }
private:
InstanceHolder(const InstanceHolder&);
InstanceHolder& operator=(const InstanceHolder&);
private:
T* mObject;
};
public:
static T* instance()
{
if (!mFlag)
{
pthread_mutex_lock(&mMutex);
if (!mFlag)
{
mInstance.set(new T());
mFlag = 1;
}
pthread_mutex_unlock(&mMutex);
}
return mInstance.get();
}
private:
static InstanceHolder mInstance;
static volatile int mFlag;
static pthread_mutex_t mMutex;
Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
template<class T> typename Singleton<T>::InstanceHolder Singleton<T>::mInstance ;
template<class T> volatile int Singleton<T>::mFlag = 0;
template<class T> pthread_mutex_t Singleton<T>::mMutex = PTHREAD_MUTEX_INITIALIZER;
#endif
***********************************************************************
#ifndef SINGLETON_H
#define SINGLETON_H
#include <pthread.h>
template< class T >
class Singleton
{
class InstanceHolder
{
public:
InstanceHolder() : mObject(0) {}
~InstanceHolder() { delete mObject; }
T* get() { return mObject; }
void set(T* p) { delete mObject; mObject = p; }
private:
InstanceHolder(const InstanceHolder&);
InstanceHolder& operator=(const InstanceHolder&);
private:
T* mObject;
};
public:
static T* instance()
{
if (!mFlag)
{
pthread_mutex_lock(&mMutex);
if (!mFlag)
{
mInstance.set(new T());
mFlag = 1;
}
pthread_mutex_unlock(&mMutex);
}
return mInstance.get();
}
private:
static InstanceHolder mInstance;
static volatile int mFlag;
static pthread_mutex_t mMutex;
Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
template<class T> typename Singleton<T>::InstanceHolder Singleton<T>::mInstance ;
template<class T> volatile int Singleton<T>::mFlag = 0;
template<class T> pthread_mutex_t Singleton<T>::mMutex = PTHREAD_MUTEX_INITIALIZER;
#endif********************************************************
#include "app.h"
#include "singleton.h"
int main()
{
ServiceController *ctl = ServiceControl::instance() ;
ctl->init() ;
ctl->run() ;
ctl->start() ;
ctl->stop() ;
return 0 ;