【发布时间】:2020-01-06 12:48:54
【问题描述】:
我正在阅读APUE 关于线程特定数据的章节。我看到以下代码片段:
void destructor(void *);
pthread_key_t key;
pthread_once_t init_done = PTHREAD_ONCE_INIT;
void thread_init(void){
err = pthread_key_create(&key, destructor);
}
int threadfunc(void *arg){
pthread_once(&init_done, thread_init);
//...
}
我有几个问题:
- 不明白
key是怎么初始化的 - 为什么这个键需要析构函数?这个析构函数有什么作用?
【问题讨论】:
-
pthread_once使用一个标志来确保一个函数只被调用一次。在这种情况下,该函数是thread_init,它使用指向key的指针来初始化它,并使用指向destructor函数的指针来清理它。这对于避免内存泄漏或打开文件或任何可能被打开或分配的东西很有用,因为线程可以出于多种原因退出,例如错误条件。析构函数更容易处理。 -
@ZanLynx,但在这个例子中,析构函数什么都不做。我说的对吗?
-
@Rudziankoŭ 我们不知道,因为所有代码显示的是一个声明,而不是函数的任何定义。照原样,它会编译但无法链接。
标签: c multithreading unix destructor