当前位置: 技术问答>linux和unix
线程专有数据问题,pthread_key_create()
来源: 互联网 发布时间:2016-05-08
本文导语: 函数原型如下: int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); 这个接口好奇怪,在创建key的时候都不知道跟这个key绑定的数据是什么,怎么可以知道用什么destructor? 另外不同的进程绑定的数据不一致怎...
函数原型如下:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
这个接口好奇怪,在创建key的时候都不知道跟这个key绑定的数据是什么,怎么可以知道用什么destructor? 另外不同的进程绑定的数据不一致怎么可以用同一个destructor?
初学多线程,请各位大虾指点
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
这个接口好奇怪,在创建key的时候都不知道跟这个key绑定的数据是什么,怎么可以知道用什么destructor? 另外不同的进程绑定的数据不一致怎么可以用同一个destructor?
初学多线程,请各位大虾指点
|
看下面的代码。destructor的参数是指针,所以你可以给任何参数。为了区分不同的线程,你可以设计一个结构,其中用tid来区分线程,用type来区分参数类型,根据type的不同来处理具体的data参数。注意,结构里的data也需要malloc和free,或者可以用数组来代替。
csdn贴代码还是不支持google的浏览器,将就看吧:
#include
#include
#include
pthread_key_t key;
typedef struct _A{
int tid;
int type;
void* data;
}A;
void echomsg(A* a)
{
printf("destructor excuted in thread %d,param tid=%d, type=%dn",pthread_self(), a->tid, a->type);
free(a);
}
void * child1(void *arg)
{
A* a = malloc(sizeof(A));
a->type = 0;
int tid=pthread_self();
a->tid = tid;
printf("thread %d entern",tid);
pthread_setspecific(key,(void *)a);
sleep(2);
printf("thread %d returns %dn",tid,pthread_getspecific(key));
sleep(5);
}
void * child2(void *arg)
{
A* a = malloc(sizeof(A));
a->type = 1;
int tid=pthread_self();
a->tid = tid;
printf("thread %d entern",tid);
pthread_setspecific(key,(void *)a);
sleep(1);
printf("thread %d returns %dn",tid,pthread_getspecific(key));
sleep(5);
}
int main(void)
{
int tid1,tid2;
printf("hellon");
pthread_key_create(&key,echomsg);
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
sleep(10);
pthread_key_delete(key);
printf("main thread exitn");
return 0;
}
|
man 一段文字贴过来:
An optional destructor function may be associated with each key value. At thread exits, if a key value has a non-NULL destructor pointer, and the thread has a non-NULL value associated with that key, the value of the key is set to NULL, and then the function pointed to is called with the previously associated value as its sole argument. The order of dustructor calls is unspecified if more than one destructor exists for a thread when it exits.
在调用destructor之前, 与key相关的value已经被set成NULL, 那调用destructor的作用是什么? 或者, 调用之后做了什么呢?
如果在pthread_key_create的时候,destructor的位置设置为NULL, 又有什么不同之处呢?
An optional destructor function may be associated with each key value. At thread exits, if a key value has a non-NULL destructor pointer, and the thread has a non-NULL value associated with that key, the value of the key is set to NULL, and then the function pointed to is called with the previously associated value as its sole argument. The order of dustructor calls is unspecified if more than one destructor exists for a thread when it exits.
在调用destructor之前, 与key相关的value已经被set成NULL, 那调用destructor的作用是什么? 或者, 调用之后做了什么呢?
如果在pthread_key_create的时候,destructor的位置设置为NULL, 又有什么不同之处呢?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。