【问题标题】:Why pthread_key need destructor?为什么 pthread_key 需要析构函数?
【发布时间】: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);
//...
}

我有几个问题:

  1. 不明白key是怎么初始化的
  2. 为什么这个键需要析构函数?这个析构函数有什么作用?

【问题讨论】:

  • pthread_once 使用一个标志来确保一个函数只被调用一次。在这种情况下,该函数是thread_init,它使用指向key 的指针来初始化它,并使用指向destructor 函数的指针来清理它。这对于避免内存泄漏或打开文件或任何可能被打开或分配的东西很有用,因为线程可以出于多种原因退出,例如错误条件。析构函数更容易处理。
  • @ZanLynx,但在这个例子中,析构函数什么都不做。我说的对吗?
  • @Rudziankoŭ 我们不知道,因为所有代码显示的是一个声明,而不是函数的任何定义。照原样,它会编译但无法链接。

标签: c multithreading unix destructor


【解决方案1】:

不明白key是怎么初始化的

key 用于标识线程特定存储中的插槽。 pthread_key_create将槽号存储在key中。

为什么这个键需要析构函数?这个析构函数有什么作用?

pthread_key_create:

一个可选的析构函数可以与每个键值相关联。在线程退出时,如果键值具有非 NULL 析构指针,并且线程具有与该键关联的非 NULL 值,则将键的值设置为 NULL,然后调用指向的函数以前关联的值作为其唯一参数。如果线程退出时存在多个析构函数,则未指定析构函数调用的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2014-03-09
    • 2018-05-24
    • 1970-01-01
    • 2020-03-10
    • 2020-11-08
    相关资源
    最近更新 更多