muduo网络库学习之ThreadLocal<T> 类、ThreadLocalSingleton<T>类封装知识点

本文详细介绍了muduo网络库中关于ThreadLocal<T>和ThreadLocalSingleton<T>的设计与实现,讲解了如何在多线程环境中实现线程私有的全局变量。文中提到了__thread关键字、pthread_key_create等线程特定数据API,并通过测试代码展示了不同线程如何拥有独立的数据实例,以及在线程结束时如何销毁这些数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ThreadLocal<T>类

1、在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。

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

一旦某个线程创建了一个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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值