C语言中使用完毕的pthread线程是否需要手动释放资源?
问题解答
默认配置下你的代码创建的线程不会自动回收所有系统资源,必须手动处理,具体规则如下:
核心原理
pthread线程默认是非分离态,这类线程退出后操作系统会保留线程ID、退出状态等核心资源,直到其他线程调用pthread_join()读取它的退出状态,才会完全释放所有关联的系统资源。如果不做任何处理,每次创建这类单次执行的线程都会残留资源,属于典型的资源泄漏,累计多次后会耗尽系统的进程号/线程配额。
适配你场景的两种解决方案
你是单次执行一次性任务的场景,两种方案都可以选择:
- 调用
pthread_join手动回收
在你需要确认线程执行完成的位置添加如下代码即可,会阻塞等待线程执行结束后自动回收全部资源:
// 第二个参数传NULL代表不需要读取线程的返回值 pthread_join(thread_id, NULL);
- 将线程设置为分离态,自动回收
设置成分离态的线程执行结束后,系统会自动释放它占用的所有资源,不需要额外调用任何函数。有两种设置方式:
- 方式一:创建线程时指定分离属性
pthread_attr_t attr; pthread_attr_init(&attr); // 设置为分离态 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread_id, &attr, threadFunction, NULL); // 销毁属性结构体 pthread_attr_destroy(&attr);
- 方式二:在线程函数内部自行设置
void *threadFunction(void *vargp) { pthread_detach(pthread_self()); // 网页检测业务逻辑 return NULL; }
额外注意
不管用哪种线程属性,线程函数内部你手动申请的堆内存、打开的文件句柄、网络套接字等资源,系统不会自动回收,必须在线程退出前手动释放。
内容的提问来源于stack exchange,提问作者Jeff Douqn
相关产品推荐
相关产品推荐

