线程特定数据知识:
http://blog.csdn.net/cogbee/article/details/9990273
例子:
#include<pthread.h>
#include<string.h>
#include <stdlib.h>
static pthread_key_t p_key;
static pthread_once_t rl_once = PTHREAD_ONCE_INIT;
static void
destructor(void *ptr)
{
free(ptr);
}
void func1()
{
}
void getkey_once(void)
{
pthread_key_create(&p_key ,destructor);
}
void *thread_func(void *args)
{
int *tmp;
int val;
pthread_once(&rl_once ,getkey_once);//本进程第一个调用getkey_once的线程创建线程特定数据
if( (tmp = (int*)pthread_getspecific(p_key)) == NULL)
{
tmp = calloc(1,sizeof(int));
*tmp = 10;//设置线程特定数据值,所有线程使用时均使用的是它的副本,即值为10
pthread_setspecific(p_key,tmp);
}
printf("%d is runing in %s\n",(*(int*)args),__func__);
val = *tmp * *((int *)args);
printf("%d is runing in %s\n",val,__func__);
return (void*)0;
}
int main()
{
pthread_t pa, pb;
int a=1;
int b=2;
pthread_create(&pa, NULL,thread_func,&a);
pthread_create(&pb, NULL,thread_func,&b);
pthread_join(pa, NULL);
pthread_join(pb, NULL);
return 0;
}