C:pthread数据特定的析构函数只调用一次
从
pthread_key_create 手册页:
我写了一个小例子,一个简单的析构函数打印“Hello World”,用于非NULL线程特定值.据我所知,这个析构函数只被调用一次(至少在linux fedora和mac os x上),即使在第一次调用析构函数后线程特定值仍然不是NULL. 我错过了什么吗?! (glibc上的PTHREAD_DESTRUCTOR_ITERATIONS = 4.) 这是我的小例子: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NB_THREADS 1 #define NB_KEYS 1 static pthread_key_t keys[NB_KEYS]; static pthread_mutex_t mutex; void destruction (void *arg) { (int) arg ++; printf ("Destructor called! -- key value : %in",(int)arg); } void* startup_routine(void* argv) { int i; int th = (int) argv; for (i = 0; i < NB_KEYS; i++) pthread_setspecific(keys[i],(void*) ((th + i)* 2)); pthread_mutex_lock(&mutex); printf("Thread %in",th); for (i = 0; i < NB_KEYS; i++) printf ("tkeys[%i] : %in",i,(int)pthread_getspecific(keys[i])); pthread_mutex_unlock(&mutex); return "End"; } int main(int argc,char** argv) { int i; void *result; pthread_t thread[NB_THREADS]; for (i = 0; i < NB_KEYS; i++) pthread_key_create(&keys[i],destruction); pthread_mutex_init(&mutex,NULL); for (i = 0; i < NB_THREADS; i++) pthread_create( &thread[i],NULL,startup_routine,(void*)(i+1) ); for (i = 0; i < NB_THREADS; i++) { pthread_join( thread[i],&result ); printf("Return from the thread %i = '%s'n",(char*)result ); } return 0; } 解决方法
似乎在这里没有很多人使用pthread!
那么,我将再次回答我自己的问题: 只有在析构函数中调用pthread_setspecific时,才会多次调用析构函数,从而更改键的值. 这是因为在调用析构函数之前,键指针设置为null并且指针被传递给析构函数.因此,如果我们希望键指针不为null,只需要在其中调用pthread_setspecific. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |