模板线程安全单例C++版本与pthread_once

工作以后单例确实经常用到,复习的时候再次翻开偶然翻到这个
代码来自陈硕的《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的线程安全
属实方便与牛批