在开始线程部分内容前,我想还是先把这个概念抛出来,否则在开始《线程的创建&属性》中会有部分内容不太清楚。
原理简述:
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。
- 一个可结合的线程能够被其他线程回收其资源和杀死,在被其他线程回收之前,他的存储器资源是不释放的;
- 一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的。在这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。
线程分离状态的设置:
设置线程分离状态的函数为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()之类的函数,它们使整个进程睡眠,并不能解决线程同步的问题。
线程属性设置的注意事项:
如果线程处于joinable状态,则只能被创建它的线程等待终止。(这里涉及到资源释放)
通过调用pthread_join来获取另一个线程的终止状态并且释放该线程所占的资源。
创建detach线程:
1. pthread_t tid;
2. pthread_attr_t attr;
3. pthread_attr_init(&attr);//初始化
4. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//进行设置
5. pthread_creat(&tid,&attr, void (*function)(void *), void *arg);//创建一个以分离属性启动的线程
在使用线程时避免线程的资源在线程结束时不能得到正确的释放,从而产生潜在内存泄露问题,在等待线程结束时,要确保该线程处于detached状态,否则就需要调用pthread_join()函数来对其进行资源回收。