Muduo库源码分析(9):线程特定数据

来源:互联网 发布:数据洪流 编辑:程序博客网 时间:2024/05/16 05:39
  • 线程私有数据
    这些数据不会因为多进程共享数据而影响,因为是每个线程特有的数据。
  • 线程私有数据实现

    1. 对于POD类型可以使用__thread来修饰(详解见Thread类封装)
      http://blog.csdn.net/jacktangj/article/details/76222350

    2. 非POD类型可以使用线程特定数据封装
      线程特定数据讲解:
      http://www.cnblogs.com/javawebsoa/archive/2013/08/09/3249130.html

template<typename T>class ThreadLocal : noncopyable{ public:  ThreadLocal()  {  // 创建键值数据,数据的销毁由destructor执行,数据空间通过malloc分配,属于堆数据,所以要delete    MCHECK(pthread_key_create(&pkey_, &ThreadLocal::destructor));  }  ~ThreadLocal()  {  // 删除键    MCHECK(pthread_key_delete(pkey_));  }// 线程特定数据  T& value()  {  // 获取线程特定数据,如果没有数据关联到该键返回值为NULL    T* perThreadValue = static_cast<T*>(pthread_getspecific(pkey_)); // 没有关联数据,在内存申请一块与key关联    if (!perThreadValue)    {      T* newObj = new T();      MCHECK(pthread_setspecific(pkey_, newObj));      perThreadValue = newObj;    }    return *perThreadValue;  } private:  static void destructor(void *x)  {  // 销毁键指向的数据的内存空间    T* obj = static_cast<T*>(x);    typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];    T_must_be_complete_type dummy; (void) dummy;    delete obj;  } private:  pthread_key_t pkey_;// 键值};
原创粉丝点击