int pthread_setspecific(pthread_key_t key, const void *pointer)
void * pthread_getspecific(pthread_key_t key)
#define PTHREAD_KEY_2NDLEVEL_SIZE
#define PTHREAD_KEY_1STLEVEL_SIZE
((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1)
/ PTHREAD_KEY_2NDLEVEL_SIZE)
其中在/usr/include/bits/local_lim.h 中定义了 PTHREAD_KEYS_MAX 为 1024,因此一维数组大小为 32。而具体存放的位置由 key 值经过以下计算得到:
该函数从 TSD 池中分配一项,将其值赋给 key 供以后访问使用。如果 destr_function 不为空,在线程退出(pthread_exit())时将以 key 所关联的数据为参数调用
destr_function(),以释放分配的缓冲区。
不论哪个线程调用pthread_key_create(),所创建的key 都是所有线程可访问的,但各个线程可根据自己的需要往 key 中填入不同的值,这就相当于提供了一个同名而不同值
的全局变量。在 LinuxThreads 的实现中,TSD 池用一个结构数组表示:
创建一个 TSD 就相当于将结构数组中的某一项设置为"in_use",并将其索引返回给*key,然后设置 destructor 函数为 destr_function。
注销一个 TSD 采用如下 API:
这个函数并不检查当前是否有线程正使用该TSD,也不会调用清理函数(destr_function),而只是将 TSD 释放以供下一次调用pthread_key_create()使用。在 LinuxThreads
中,它还会将与之相关的线程数据项设为 NULL(见"访问")。
访问
TSD 的读写都通过专门的 Posix Thread 函数进行, 其 API 定义如下:
写入(pthread_setspecific())时,将pointer 的值(不是所指的内容)与 key 相关联,而相应的读出函数则将与 key 相关联的数据读出来。数据类型都设为 void *,因此可
以指向任何类型的数据。
在 LinuxThreads 中,使用了一个位于线程描述结构(_pthread_descr_struct)中的二维 void *指针数组来存放与 key 关联的数据,数组大小由以下几个宏来说明:
int pthread_key_delete(pthread_key_t key)
static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] = { { 0, NULL } };