pthread_key是线程私有变量,它可以使多个线程用一个全局变量,但各自持有不同的值(通过pthread_set_specific调用)。
pthread_key的使用一般是经过pthread_key_create->pthread_set_specific->pthread_key_delete这三个过程。如果pthread_key_create多次结果会怎样呢?多次pthread_key_create主要关系到私有变量和销毁函数。
根据私有变量(pram)和销毁函数(func),多次pthread_key_create分两种情况:
(1).私有变量不变,多次绑定func
(2).私有变量不同,绑定不同func
体现在代码中就是这样(假定pram为1):
(1).
void func(int *data)
{
if (data != NULL)
printf("key data is:%d\n", *data);
}
void func1(int *data)
{
if (data != NULL)
printf("key data is:%d\n", (*data) + 10);
}
pthread_key_create(&key, func);
pthread_key_create(&key, func1);
...
pthread_set_specific(key, pram);
(2).
pthread_key_create(&key, func);
...
pthread_set_specific(key, pram);
pthread_key_create(&key, func1);
...
pthread_set_specific(key, pram);
猜猜各自运行结果怎么样?
(1)最后输出——"key data is 11"
(2)最后输出——"key data is 1"
"key data is 11"
其实pthread_key_create会做两件事。首先,它将线程私有变量置为NULL,然后置销毁函数为destroy_func。然后在线程退出时,它会判断是否有私有变量,若为NULL就不调用销毁函数。
最后附上一段可以直接运行的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_key_t key;
void destroy_func1(int *data)
{
if (data == NULL) {
return;
} else {
printf("key data plus 10 is:%d\n", *data + 10);
free(data);
data = NULL;
}
}
void destroy_func(int *data)
{
if (data == NULL) {
return;
} else {
printf("key data is :%d\n",*data);
free(data);
data = NULL;
}
}
void *thread_func()
{
int *data = NULL;
pthread_key_create(&key, destroy_func);
data = pthread_getspecific(key);
if (data == NULL) {
data = (int *)malloc(sizeof(int));
*data = 1;
pthread_setspecific(key, data);
}
pthread_key_create(&key, destroy_func1);
data = pthread_getspecific(key);
if (data == NULL) {
data = (int *)malloc(sizeof(int));
*data = 2;
pthread_setspecific(key,data);
}
printf("hello world\n");
}
int main(int argc, char **argv)
{
pthread_t pid;
pthread_create(&pid, NULL, thread_func, NULL);
pthread_join(pid, NULL);
pthread_key_delete(key);
}