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):