如何解决pthread_join释放被终止线程持有的堆吗?
我正在读一本教科书,上面写着:
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
仍指向可以打印字符串的分配堆内存。因此在对等线程中分配的堆内存尚未释放。
那么终止线程持有的哪种内存资源将被利用?
解决方法
创建线程;通常某个地方(例如库,内核)需要为新线程分配一个堆栈,在不使用CPU的地方创建一个存储状态(寄存器等)的地方,在某个地方创建存储元数据的地方(信号掩码,优先级,使用的CPU时间等),为其线程本地存储分配空间等。所有这些东西都需要释放;但它们是您的代码不负责(库需要负责)的“内部内容”。
您可以控制的内容(来自堆的内存)大部分属于进程,并且不属于任何特定线程;并且不会在任何线程终止时被释放(除非最后一个线程终止导致进程终止,因为它没有线程了)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。