线程特定数据

线程特定数据:私有数据
一个线程无法阻止另一个线程访问它的数据,线程特定数据也不例外。但是特定数据管理可以提高线程间数据的独立性。
在多、单线程程序中,由于数据空间是共享的,全局变量为所有线程所共有,可以在多个函数间访,但有时应用程序有必要提供线程”私有”的全局变量,”仅在某个线程中有效,但却可以跨多个函数访问”。

关键接口:
int pthread_key_create(pthread_key_t key, void (*destr_function) (void ));
int pthread_key_delete(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *pointer);
void * pthread_getspecific(pthread_key_t key);
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));

相关操作:
通过pthread_key_create”创建”key(多线程共享),不同的线程用pthread_setspecific接口把key与不同的value”关联”(线程特定数据)。
注意:
1、pthread_key_create的第二个参数是析构函数,为NULL使用默认析构函数,也可自己实现. 在线程正常退出、线程取消可以被调用;在exit,_exit、_Exit、abort、非正常退出时不会调用.
2、系统可以为每个线程分配多个key(128个), 并且每个key都有析构函数.
3、多线程同步访问key时可能会看到不同的key,因此可以用
带有互斥量的pthread_once接口 保证key只被初始化一次.

获取key的原理:
每个key[n]包含: 标志 + 析构函数
标志: 表明这个数据元素是否正在使用。 当一个线程调用pthread_key_create创建一个新的线程特定数据元素时,系统会搜索Key结构数组,找出第一个“不在使用”的元素。并把该元素的索引(0~127,称为“键”)返回给调用线程。

每个线程可以通过该key找到对应的位置,并且为这个位置存储一个值(指针)。一般来说,这个指针通常是每个线程通过调用malloc来获得的。
线程特定数据

线程特定数据
参考:
http://blog.****.net/zjf280441589/article/details/43883033