线程的分离状态 pthread_attr_setdetachstate 函数使用

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程可以被其余线程收回其资源和杀死;在被其余线程回收以前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其余线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。程序员

        线程的分离状态决定一个线程以什么样的方式来终止本身。在默认状况下线程是非分离状态的,这种状况下,原有的线程等待建立的线程结束。只有当pthread_join()函数返回时,建立的线程才算终止,才能释放本身占用的系统资源。而分离线程不是这样子的,它没有被其余的线程所等待,本身运行结束了,线程也就终止了,立刻释放系统资源。程序员应该根据本身的须要,选择适当的分离状态。因此若是咱们在建立线程时就知道不须要了解线程的终止状态,则能够pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。编程

设置线程分离状态的函数为pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。这里要注意的一点是,若是设置一个线程为分离线程,而这个线程运行又很是快,它极可能在pthread_create函数返回以前就终止了,它终止之后就可能将线程号和系统资源移交给其余的线程使用,这样调用pthread_create的线程就获得了错误的线程号。要避免这种状况能够采起必定的同步措施,最简单的方法之一是能够在被建立的线程里调用pthread_cond_timewait函数,让这个线程等待一下子,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里经常使用的方法。可是注意不要使用诸如wait()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。多线程

另一个可能经常使用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,通常说来,咱们老是先取优先级,对取得的值修改后再存放回去。函数

线程等待——正确处理线程终止spa

#include <pthread.h>
void pthread_exit(void *retval);
void pthread_join(pthread_t th,void *thread_return);//挂起等待th结束,*thread_return=retval;
int pthread_detach(pthread_t th);

若是线程处于joinable状态,则只能只能被建立他的线程等待终止。
操作系统

在Linux平台默认状况下,虽然各个线程之间是相互独立的,一个线程的终止不会去通知或影响其余的线程。可是已经终止的线程的资源并不会随着线程的终止而获得释放,咱们须要调用 pthread_join() 来得到另外一个线程的终止状态而且释放该线程所占的资源。(说明:线程处于joinable状态下)线程

调用该函数的线程将挂起,等待 th 所表示的线程的结束。 thread_return 是指向线程 th 返回值的指针。须要注意的是 th 所表示的线程必须是 joinable 的,即处于非 detached(游离)状态;而且只能够有惟一的一个线程对 th 调用 pthread_join() 。若是 th 处于 detached 状态,那么对 th 的 pthread_join() 调用将返回错误。指针

若是不关心一个线程的结束状态,那么也能够将一个线程设置为 detached 状态,从而让操做系统在该线程结束时来回收它所占的资源。将一个线程设置为detached 状态能够经过两种方式来实现。一种是调用 pthread_detach() 函数,能够将线程 th 设置为 detached 状态。另外一种方法是在建立线程时就将它设置为 detached 状态,首先初始化一个线程属性变量,而后将其设置为 detached 状态,最后将它做为参数传入线程建立函数 pthread_create(),这样所建立出来的线程就直接处于 detached 状态。code

建立 detach 线程:进程

pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, THREAD_FUNCTION, arg);

总之为了在使用 pthread 时避免线程的资源在线程结束时不能获得正确释放,从而避免产生潜在的内存泄漏问题,在对待线程结束时,要确保该线程处于 detached 状态,否着就须要调用 pthread_join() 函数来对其进行资源回收。

相关文章
相关标签/搜索