Base——ThreadLocal类

1.线程特定数据(Thread-specific Data,TSD)

Thread类.中通过 __thread 来标示属于线程自己内部数据,但只能适用于POD类型数据,对于其它类型的变量利用POSIX线程库所提供的方法。

int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));

线程退出时,调用 destructor()函数来释放线程特定数据
int pthread_key_delete(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
void *pthread_getspecific(pthread_key_t key);

为当前线程设置、获取特定数据

在这里插入图片描述

2.测试用例 ThreadLocal_test.cc、SingletonThreadLocal_test.cc

运行结果(ThreadLocal_test.cc):
在这里插入图片描述
testObj1.value().setName(“main one”);

  • testObject1、testObject2是线程特定类对象,定义如下:
    在这里插入图片描述
  • value()函数定义如下:
    在这里插入图片描述
    由于主线程此时并没有设置pkey_对应的value,所以perThreadValue为空,会执行new T(),执行 T 类型的构造函数(此处即调用Test类的构造函数),并将name赋值为 main one
  • 最终输出结果:
    在这里插入图片描述

print();

  • 函数定义如下:
    在这里插入图片描述
    此时打印的obj1的name为 main one,在打印obj2的时候先要执行 T 类型的构造函数
    在这里插入图片描述

muduo::Thread t1(threadFunc);
t1.start();
t1.join();

  • 创建了一个子线程,线程函数为 threadFunc(),定义如下:
    在这里插入图片描述
  • 在第一次进行print()时,会先执行 T 类型的构造函数,然后打印信息,结果如下:
    在这里插入图片描述
  • 然后分别设置obj1、obj2的name,打印出信息,如下:
    在这里插入图片描述
  • 最后,子线程函数结束,调用析构函数
    在这里插入图片描述

testObj2.value().setName(“main two”);
print();

  • 主线程设置obj2的name,打印
    在这里插入图片描述
  • 最终主线程退出,调用析构函数
    在这里插入图片描述

运行结果(SingletonThreadLocal_test.cc):
在这里插入图片描述

参考代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值