【问题标题】:does pthread_join free the heap that is held by the terminated thread?pthread_join 是否释放终止线程持有的堆?
【发布时间】:2020-10-15 01:52:20
【问题描述】:

我在读一本教科书,上面写着:

int pthread_join(pthread_t tid, void **thread_return);

pthread_join 函数阻塞直到线程 tid 终止,将线程例程返回的通用 (void *) 指针分配给 thread_return 指向的位置,然后获取终止线程持有的所有内存资源。

我对终止线程持有的内存资源有点困惑,听起来 pthread_join 会隐式调用free 以释放终止线程中的堆内存,但显然事实并非如此,例如:

void *thread(void *arg) {
  char *ret;

  if ((ret = (char*) malloc(20)) == NULL) {       //<------------allocated heap memory
    perror("malloc() error");
    exit(2);
  }
  strcpy(ret, "This is a test");
  pthread_exit(ret);
}

main() {
  pthread_t thid;
  void *ret;

  if (pthread_create(&thid, NULL, thread, NULL) != 0) {
    perror("pthread_create() error");
    exit(1);
  }

  if (pthread_join(thid, &ret) != 0) {          
    perror("pthread_create() error");
    exit(3);
  }

  printf("thread exited with '%s'\n", ret);
}

pthread_join 被调用后,ret 仍然指向分配的堆内存,可以打印字符串。所以对等线程中分配的堆内存没有释放。

那么被终止的线程持有的什么样的内存资源会被回收呢?

【问题讨论】:

  • 我认为它只是指用于表示线程的内存,而不是线程代码使用的内存。
  • 线程的任何“线程本地存储”也将被释放。

标签: c multithreading pthreads


【解决方案1】:

创建一个线程;通常某个地方(例如库,可能是内核)需要为新线程分配堆栈,在不使用 CPU 时创建某个地方来存储其状态(寄存器等),创建某个地方来存储元数据(信号掩码,优先级,使用的CPU时间等),为其线程本地存储分配空间等。所有这些都需要释放;但它们是您的代码不负责的“内部内容”(库需要负责)。

您确实可以控制的东西(来自堆的内存)大多属于进程,不属于任何特定线程;并且不会在任何线程终止时被释放(除非最后一个线程终止导致进程因为没有剩余线程而终止)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2013-10-15
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多