一、ThreadLocal<T>类
1、在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。
2、在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。
3、但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。
4、POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称为(Thread-specific Data,或 TSD)。
5、线程特定数据也称为线程本地存储TLS(Thread-local storage)
6、对于POD类型的线程本地存储,可以用__thread关键字
2、在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。
3、但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。
4、POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称为(Thread-specific Data,或 TSD)。
5、线程特定数据也称为线程本地存储TLS(Thread-local storage)
6、对于POD类型的线程本地存储,可以用__thread关键字
pthread_key_create、pthread_key_delete、pthread_getspecific、pthread_setspecific,更多信息请看
这里。
template<typename T>
class ThreadLocal : boost::noncopyable
class ThreadLocal : boost::noncopyable
一旦某个线程创建了一个key,比如key[1],那么其他线程也有自己的key[1],它们通过各自的key[1]访问到的实际数据(堆上内存分配的空间)是不同的,pthread_key_delete 只是删除key,实际数据空间的释放需要在pthread_key_create 中注册一个回调函数destructor去delete T*。
ThreadLocal()
{
{
pthread_key_create(&pkey_, &ThreadLocal::destructor);
}
当某个线程运行结束,这个线程对应的实际数据T也没有存在的价值,会调用destructor,从而delete T*;
也就是说如果有两个线程,那么destructor会执行两次,因为实际数据T在每个线程中各有一份。
key 的删除在~ThreadLocal()函数内:
~ThreadLocal()
{
{
pthread_key_delete(pkey_);
}
测试代码:
SingletonThreadLocal_test.cc:
C++ Code