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的,调用后会出错