本文主要是介绍(P18)muduo_base库源码分析:线程特定数据,ThreadLocal类的封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.线程特定数据
- 2.ThreadLocal类的封装
1.线程特定数据
-
在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。
-
在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。
-
但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。
-
POSIX线程库通过维护一定的数据结构来解决这个问题,这个些数据称为(Thread-specific Data,或 TSD)。
-
线程特定数据也称为线程本地存储TLS(Thread-local storage)
-
对于POD类型的线程本地存储,可以用__thread关键字
-
线程特定数据的接口如下
pthread_key_create
一旦一个线程创建了一个key,其他线程都有这个keypthread_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对象的地址都是不一样的。
这篇关于(P18)muduo_base库源码分析:线程特定数据,ThreadLocal类的封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!