linux线程退出的方式及线程资源清理
2016-08-03 16:38
246 查看
关键词:线程资源释放, pthread_join()
1, 每个线程有自己的一组寄存器,自己的栈空间, 自己的errno变量;
2,pthread_create线程创建并不能保证哪个线程先运行,新线程还是调用线程。
3,线程正常退出的方式有三种: 线程函数直接return, 被同一进程中的其他线程调用pthread_cancel取消,线程调用pthread_exit 退出,(线程运行异常退出)。
4,不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题,https://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part4/ 一文中介绍了pthread_cleanup_push()/pthread_cleanup_pop()解决资源释放问题,因为没有用到,不写在这里,对于异常退出的情况,注意在每个退出的点上都加上资源,尤其是锁资源的释放。
5,对于线程正常退出的资源释放,根据线程的属性,有两种方式: 对于属性为joinable的(默认),线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放;对于属性为detached分离状态的,线程在结束运行时自行释放所占用的内存资源。
6,把线程置为detached属性有两种方式,一种是在线程创建时设置属性pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);另一种是调用pthread_detach()使线程成为detached,就可以自动释放资源了。
7,对于属性为joinable的线程,可以通过调用pthread_detach()将其属性改变为detached, 但是属性为detached的线程,不能改回joinable属性, 也就是不能调用pthread_join()释放资源。
8,如果线程pthread_detach()执行之后,对线程请求pthread_join()将返回错误,如果线程已经被调用pthread_join()后,再调用pthread_detach()就不会有任何效果。
9,一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收。
10,pthread_join()函数:以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
1, 每个线程有自己的一组寄存器,自己的栈空间, 自己的errno变量;
2,pthread_create线程创建并不能保证哪个线程先运行,新线程还是调用线程。
3,线程正常退出的方式有三种: 线程函数直接return, 被同一进程中的其他线程调用pthread_cancel取消,线程调用pthread_exit 退出,(线程运行异常退出)。
4,不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题,https://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part4/ 一文中介绍了pthread_cleanup_push()/pthread_cleanup_pop()解决资源释放问题,因为没有用到,不写在这里,对于异常退出的情况,注意在每个退出的点上都加上资源,尤其是锁资源的释放。
5,对于线程正常退出的资源释放,根据线程的属性,有两种方式: 对于属性为joinable的(默认),线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放;对于属性为detached分离状态的,线程在结束运行时自行释放所占用的内存资源。
6,把线程置为detached属性有两种方式,一种是在线程创建时设置属性pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);另一种是调用pthread_detach()使线程成为detached,就可以自动释放资源了。
7,对于属性为joinable的线程,可以通过调用pthread_detach()将其属性改变为detached, 但是属性为detached的线程,不能改回joinable属性, 也就是不能调用pthread_join()释放资源。
8,如果线程pthread_detach()执行之后,对线程请求pthread_join()将返回错误,如果线程已经被调用pthread_join()后,再调用pthread_detach()就不会有任何效果。
9,一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收。
10,pthread_join()函数:以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
相关文章推荐
- 线程退出的几种方式和资源回收【线程编程中避免内存泄漏】
- Linux线程退出方式总结(推荐)
- 线程退出的几种方式和资源回收及设置线程属性
- linux进程退出,线程资源用pthread_detach释放
- Linux线程退出方式总结
- [置顶] Linux线程退出方式总结
- 线程终止资源清理方式
- linux下 c中怎么让才能安全关闭线程 和 linux线程退出时执行的程序(线程清理处理程序)简单例子
- linux线程退出时执行的程序(线程清理处理程序)简单例子
- Linux线程资源限制
- 线程退出的几种方式
- 实战Nagios NSCA方式监控Linux系统资源使用情况 -- Nagios配置篇 -- Nagios Server端
- linux下使用线程锁互斥访问资源
- 实战Nagios NSCA方式监控Linux系统资源使用情况 -- Nagios配置篇 -- 被监控端
- Linux的进程/线程通信方式总结
- Linux pthread_exit及线程清理函数
- [Linux线程]线程的阻塞和退出
- 转载_linux 两种方式 创建内核线程
- SylixOS单个线程的退出方式
- Windows线程创建、退出及资源释放