有时候,线程唯一的数据很有用。
TSD提供了这种需要一套函数调用的全局数据。本质上,这通过创建依附于特定线程的“key-value”数组来实现。
key 是pthread_key_t类型(整数类型)的变量,一旦key被创建,你就可以通过pthread_getspecific()/pthread_setspecific()来访问key关联的数据。
value是void*类型(32位和64位),当你想放任何比void*大的数据结构时,就要用malloc()为该数据结构分配好内存并放个指向该数据结构的指针在void* cell里。
TSD的标准用法是:
全局声明所有的key,在main()里初始化他们,然后创建线程,启动程序。
如果你在一个库里创建某种TSD,那你就必须在使用之前安排好初始化工作。
Usage of POSIX TSD
pthread_key_t house_key;
foo((void *) arg)
{
pthread_setspecific(house_key, arg);
bar();
}
bar()
{
float n;
n = (float) pthread_getspecific(house_key);
}
main()
{...
pthread_keycreate(&house_key, destroyer);
pthread_create(&tid, NULL, foo, (void *) 1.414);
pthread_create(&tid, NULL, foo, (void *) 3.1415926);
...}
第一个线程将看到root(2),第2个线程将看到pi。
POSIX允许你清除1个TSD,通过pthread_key_delete().但这似乎是个坏主意!
调用pthread_getspecific()需要注意的是如果key还未被设置,返回的将是NULL。
TLS(Thread Local Storage)是一种实现TSD的方法,局限是不能动态分配,需要编译器支持,要么特别的内存影射技巧。
TSD key 是全局共享的变量。但由于从不被改变,所以不需要加锁。可以把它看成常量。
阅读(804) | 评论(0) | 转发(0) |