您的位置:首页 > 其它

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

2017-08-08 12:48 218 查看
线程私有数据

这些数据不会因为多进程共享数据而影响,因为是每个线程特有的数据。

线程私有数据实现

对于POD类型可以使用__thread来修饰(详解见Thread类封装)

http://blog.csdn.net/jacktangj/article/details/76222350

非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_;// 键值
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mudduo