QNX系统下如何从运行进程中彻底移除已终止的线程
问题核心原因
你当前代码的main函数进入了无限循环,永远无法执行到后续的pthread_join逻辑,所以终止的非分离线程会一直保留DEAD状态等待被回收,自然会在pidin的查询结果中显示。
要实现线程退出后直接从进程线程列表中移除,有两种可行方案:
方案1:将线程设置为分离态
分离态的线程退出时,系统会自动回收其所有资源,不需要手动调用pthread_join,也不会留下DEAD状态的条目。
设置方式有两种:
- 创建线程时指定分离属性:
// 初始化线程属性 pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 传入属性创建线程 pthread_create(&thid, &attr, thread, NULL); // 销毁属性 pthread_attr_destroy(&attr);
- 在线程执行逻辑内部调用
pthread_detach(pthread_self())自行标记为分离态。
注意:分离态线程的返回值无法被获取,也不能再对其调用
pthread_join,适合不需要获取线程执行结果的场景。
方案2:确保主线程执行
pthread_join逻辑 如果需要获取子线程的返回值,不能使用分离态,就需要调整main函数的无限循环逻辑,让主线程能够执行到pthread_join。
比如可以通过全局变量标记子线程状态,主线程循环中检测到子线程退出后就跳出循环执行join:
// 全局标记,生产环境建议用原子操作保证线程安全 int thread_exit_flag = 0; void *thread(void *arg) { // 原有逻辑 strcpy(ret, "This is a test"); thread_exit_flag = 1; // 退出前设置标记 pthread_exit(ret); } int main() { // 原有创建线程逻辑 while(!thread_exit_flag){ // 原有循环逻辑 } // 跳出循环后执行join回收资源 if (pthread_join(thid, &ret) != 0) { perror("pthread_join() error"); exit(3); } printf("thread exited with '%s'\n", ret); // 后续如果还要继续运行就再进入循环即可 while(1) {} }
执行完pthread_join后,子线程的资源就会被完全回收,pidin查询时就只会显示1个运行中的主线程。
内容的提问来源于stack exchange,提问作者Bach Le Duy
相关产品推荐
相关产品推荐

