Linux线程退出、资源回收、资源清理的方法

参考  Linux线程退出、资源回收、资源清理的方法_linux线程退出会释放哪些资源-CSDN博客

 

首先说明线程中要回收哪些资源,理解清楚了这点之后在思考资源回收的问题。

1、子线程创建时从父线程copy出来的栈内存;

  线程退出有多种方式,如return,pthread_exit,pthread_cancel等;线程分为可结合的(joinable)和 分离的(detached)两种,如果没有在创建线程时设置线程的属性为PTHREAD_CREATE_DETACHED,则线程默认是可结合的。可结合的线程在线程退出后不会立即释放资源,必须要调用pthread_join来显式的结束线程。分离的线程在线程退出时系统会自动回收资源。

  对于这类资源,主要通过 【设置分离属性 】和 【 pthread_join()】 两种方法来处理。

  其中设置分离属性又可以分别用【pthread_attr_setdetachstat()】和【pthread_detach()】来处理。

2、子线程内部单独申请的堆内存(malloc、realloc、calloc)和锁资源mutex;

  一旦又处于挂起状态的取消请求(即加锁之后,解锁之前),线程在执行到取消点时如果只是草草收场,这会将共享变量以及pthreads对象(例如互斥量)置于一种不一致状态,可能导致进程中其他线程产生错误结果、死锁,甚至造成程序崩溃。为避免这一问题:

  使用清理函数pthread_cleanup_push()和pthread_cleanup_pop()来处理。

 

 

 

线程退出和资源回收

线程退出有多种方式,如return,pthread_exit,pthread_cancel等;线程分为可结合的(joinable)和 分离的(detached)两种,如果没有在创建线程时设置线程的属性为PTHREAD_CREATE_DETACHED,则线程默认是可结合的。可结合的线程在线程退出后不会立即释放资源,必须要调用pthread_join来显式的结束线程。分离的线程在线程退出时系统会自动回收资源。

一、设置分离线程的几种方法:

1.在创建线程时加上

pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);

/* 设置线程的属性为分离的 */

pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);

/* 销毁一个目标结构,并且使它在重新初始化之前不能重新使用 */

pthread_attr_destroy (&attr);
2.在线程中调用pthread_detach(pthread_self());

3.主线程中调用pthread_detach(pid),pid为子线程的线程号

要注意的是,设置为分离的线程是不能调用pthread_join的,调用后会出错

posted @   小城熊儿  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-11-19 全志t507 tp2815 采集摄像头视频 app应用demo ffmpeg5将NV21转rgb
2020-11-19 qt 记录一个qt串口获取指定格式加密报文的一个函数
点击右上角即可分享
微信分享提示