本文主要是介绍base10. ThreadLocalSingleton线程本地单例模板类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ThreadLocalSingleton类图
数据成员:
static _thread T* t_value:一个类型是T的线程本地指针t_value,该指针是POD类型,故线程本地存储可以用__thread关键字
static Deleter deleter:一个类型是Deleter的deleter_对象,deleter_对象主要是为了能够调用destructor使得t_value_可以被自动释放
成员函数:
static T& instance():返回单例对象t_value_的引用,调用deleter_.set()使得t_value_可以被自动销毁,因为每个线程都有一个指针,因此不需要额外考虑线程安全
static T* pointer():返回单例对象t_value_的指针
static void destructor(void* obj):调用delete函数销毁单例对象t_value_
Deleter类图
数据成员:
pthread_key_t pkey_:一个指向线程特定数据的pthread_key_t类型的pkey_对象
成员函数:
Deleter():构造函数,调用pthread_key_create()创建pkey_,并注册销毁函数destructor()
~Deleter():析构函数,调用pthread_key_delete()销毁pkey_
void set(T* newObj):调用pthread_setspecific可以为t_value_设置线程特定绑定
ThreadLocalSingleton.h
//线程本地单例类封装ThreadLocalSingleton.h
#ifndef MUDUO_BASE_THREADLOCALSINGLETON_H
#define MUDUO_BASE_THREADLOCALSINGLETON_H#include <boost/noncopyable.hpp>
#include <assert.h>
#include <pthread.h>namespace muduo
{template<typename T>
class ThreadLocalSingleton : boost::noncopyable
{public://返回单例对象t_value_的引用,因为每个线程都有一个指针,因此不需要额外考虑线程安全static T& instance(){if (!t_value_){t_value_ = new T();//调用deleter_.set()使得t_value_可以被自动销毁deleter_.set(t_value_);}return *t_value_;}//返回单例对象t_value_的指针static T* pointer(){return t_value_;}private://调用delete函数销毁单例对象t_value_static void destructor(void* obj){assert(obj == t_value_);typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];delete t_value_;t_value_ = 0;}//嵌套类Deleter,该类目的是在t_value_对象销毁时自动回调destructor()函数class Deleter{public:Deleter(){pthread_key_create(&pkey_, &ThreadLocalSingleton::destructor);}~Deleter(){pthread_key_delete(pkey_);}void set(T* newObj){assert(pthread_getspecific(pkey_) == NULL);pthread_setspecific(pkey_, newObj);}pthread_key_t pkey_;};//一个类型是T的线程本地指针t_value_,该指针是POD类型,故线程本地存储可以用__thread关键字static __thread T* t_value_;//一个类型是Deleter的deleter_对象,deleter_对象主要是为了能够调用destructor使得t_value_可以被自动释放static Deleter deleter_;
};template<typename T>
__thread T* ThreadLocalSingleton<T>::t_value_ = 0;template<typename T>
typename ThreadLocalSingleton<T>::Deleter ThreadLocalSingleton<T>::deleter_;}
#endif
这篇关于base10. ThreadLocalSingleton线程本地单例模板类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!