#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:
static T& instance()
{
if (!t_value_)
{
t_value_ = new T();
deleter_.set(t_value_);
}
return *t_value_;
}
static T* pointer()
{
return t_value_;
}
private:
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;
}
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_;
};
//这里可以不用static吗
//__thread T* t_value_; 可以吗
//不可以 同一线程里的 ThreadLocalSingleton<A> a,b;会有两个 t_value_ a.t_value,b.t_value;
//但是在不同线程里 __thread变量会告诉对象 t_value是线程局部变量。
static __thread T* 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

最新文章

  1. 《征服 C 指针》摘录5:函数形参 和 空的下标运算符[]
  2. (小常识)Dictionary的遍历
  3. 堆 poj 2010
  4. 禁用符合一定条件的AD对象 (含Filter参数的写法)
  5. 十一、Swing
  6. 黑马程序员——JAVA基础之List集合
  7. branch
  8. Python操作RabbitMQ初体验(一)
  9. Android 常用UI控件之TabHost(4)实现当Tab栏有多个tab时,可以左右滑动
  10. UE-9260使用说明1
  11. hadoop Yarn运行机制
  12. javaWeb页面实现下载
  13. WPF 自定义RadioButton样式
  14. MS SQL Server 2008 R2 常规操作
  15. 隔离 docker 容器中的用户
  16. MongoDB从入门到优化
  17. 【Java并发.4】对象的组合
  18. 第26月第23天 nsobject 单例 CFAbsoluteTimeGetCurrent
  19. el表达式用==和eq的注意事项
  20. go编译

热门文章

  1. java学习笔记系列整理说明
  2. I/O:RandomAccessFile
  3. Image Classification
  4. 为什么说是时候拥抱.NET CORE了?
  5. .net持续集成cake篇之使用vs或者vscode来辅助开发cake脚本
  6. HDFS的HA(高可用)
  7. Android拨打电话权限总结
  8. 2017day1
  9. 段落超出div部分隐藏显示
  10. HTML结构 语义化思想