(P18)muduo_base库源码分析:线程特定数据,ThreadLocal类的封装

1.线程特定数据

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

  • 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。

  • 但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。

  • POSIX线程库通过维护一定的数据结构来解决这个问题,这个些数据称为(Thread-specific Data,或 TSD)。

  • 线程特定数据也称为线程本地存储TLS(Thread-local storage)

  • 对于POD类型的线程本地存储,可以用__thread关键字

  • 线程特定数据的接口如下

pthread_key_create
一旦一个线程创建了一个key,其他线程都有这个key

pthread_key_delete
删除key,并不是删除数据;删除数据需要在pthread_key_create时,指定一个回调函数去销毁,因为
这个数据是堆上数据

pthread_getspecific获取
不同的线程可以通过这个key来访问这个数据

pthread_setspecific
为特定的线程指定特定的数据,这些实际数据就是线程所私有的

  • TSD图例如下
    在这里插入图片描述

2.ThreadLocal类的封装

  • 线程本地存储,ThreadLocal类的封装
    在这里插入图片描述

  • eg:src\18\jmuduo\muduo\base\ThreadLocal.h

  • eg测试:src\18\jmuduo\muduo\base\tests\ThreadLocal_test.cc

  • 测试:
    在这里插入图片描述
    解释如下:子线程运行完毕,2个TSD对象就被销毁了
    在这里插入图片描述

  • eg测试:src\18\jmuduo\muduo\base\tests\SingletonThreadLocal_test.cc
    src\18\jmuduo\muduo\base\tests\CMakeLists.txt

  • 测试:
    在这里插入图片描述
    每个线程的TSD对象的地址都是不一样的。
    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值