工作以后单例确实经常用到,复习的时候再次翻开偶然翻到这个
代码来自陈硕的《Linux多线程服务器编程》, 其核心就是用了pthread_once
template<typename T>
class Singleton: boost::noncopyable
{
public:
static T& instance() {
pthread_once(&ponce_, &Singleton::init);
return *value_;
}
private:
Singleton();
~Singleton();
static void init() { value_ = new T(); }
private:
static pthread_once_t ponce_;
static T* value_;
}
template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT; // pthread固定用法,初始化必须
template<typename T>
T* Singleton<T>::value_ = NULL;
pthread_once语句能够有pthreads库保证只执行一次,并且由此实现了模板元编程与lazy init的线程安全
属实方便与牛批