浅析Linux中的线程局部存储( 六 )

// Release storage pointed to by 'value'

只要线程终止时与key关联的值不为NULL , 则destructor所指的函数将会自动被调用 。 如果一个线程中有多个线程局部存储变量 , 那么对各个变量所对应的destructor函数的调用顺序是不确定的 , 因此 , 每个变量的destructor函数的设计应该相互独立 。

函数pthread_key_delete()并不检查当前是否有线程正在使用该线程局部数据变量 , 也不会调用清理函数destructor , 而只是将其释放以供下一次调用pthread_key_create()使用 。 在Linux线程中 , 它还会将与之相关的线程数据项设置为NULL 。

由于系统对每个进程中pthread_key_t类型的个数是有限制的 , 所以进程中并不能创建无限个的pthread_key_t变量 。 Linux中可以通过PTHREAD_KEY_MAX(定义于limits.h文件中)或者系统调用sysconf(_SC_THREAD_KEYS_MAX)来确定当前系统最多支持多少个键 。 Linux中默认是1024个键 , 这对于大多数程序来说已经足够了 。 如果一个线程中有多个线程局部存储变量 , 通常可以将这些变量封装到一个数据结构中 , 然后使封装后的数据结构与一个线程局部变量相关联 , 这样就能减少对键值的使用 。

推荐阅读