线程的分离与结合

原文地址:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.html

线程的分离与结合

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

线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用了线程的默认属性,即为非分离状态(即可结合的,joinable,需要回收),这种情况下,原有的线程等待创建的线程结束;只有当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()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。

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

4)线程等待——正确处理线程终止

#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 状态。

创建 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() 函数来对其进行资源回收。

时间: 2024-07-31 14:18:28

线程的分离与结合的相关文章

线程的分离状态与结合状态

以下内容引用自:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.html 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached). 可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的. 分离的线程是不能被其他线程回收或者杀死的,它的存储器资源在它终止时由系统来释放. 在默认情况下,线程是非分离状态的.如果不需要了解线程的终止状态,就让线程以分离状

(转)linux多线程,线程的分离与结合

转自:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm 线程的分离与结合     在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 设置线程分离状态的函数为pthread_attr_set

线程的分离状态 detached joinable

转自  http://blog.chinaunix.net/uid-26983585-id-3315953.html 部分红色背景部分是自己添加. 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的时候都是显示创建线程失败,我就百度了一下,有人说是桟资源不足引起的,要调用一个pthread_attr_setdetachstate()函数,当时不明白为什么,其原理是什么,于是又搜了一下,下文是其原理简述: 在任何一个时间点上,线程是可结合的(joinable),或者

线程的分离状态

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己.在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束.只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统

学习pthreads,使用属性对象创建结合线程和分离线程

当我们创建了子线程,是让它犹如脱缰之马,信步驰骋,还是如乖巧听话的孩子,时不时教导一下呢?针对这个问题,本文介绍线程的结合和分离,结构分为三个部分,第一部分给出代码示例,第二部分对代码进行讲解,第三部分是运行结果. 一 代码示例 二 代码讲解 该函数是线程执行的子函数,打印输出线程的ID和一个计算结果,然后终止线程 定义线程变量,属性对象变量和一些常见变量.属性对象变量可以根据自己的需求来设置,从而通过属性对象来设置线程的属性,在这里主要是设置线程的结合和分离属性. 对属性对象变量进行初始化,并

线程的分离

基础知识 默认情况下,线程被创建成可结合的.为了避免存储器泄漏,每个可结合线程都应该被显示回收,即调用pthread_join,或通过调用pthread_detach函数被分离. 1)如果一个可结合线程运行结束但没有被join,则它的状态类似与僵尸进程. 2)若调用pthread_join后,该线程还没有结束运行,调用者会被阻塞.为了避免此现象,可在子线程中加入代码 pthread_detach(pthread_self()) 或者父线程调用 pthread_detach(thread_id)(

线程的控制和分离

线程的概念:线程是运行在进程内的一个基本执行流,和进程共享地址空间及资源(类似于父子进程共享地址空间),但每个也有自己的私有资源. 进程强调独占性 每个进程都有它独立的地址空间,包括Text Segment.Data Segment等 线程强调共享性 线程的共享资源: 1.进程代码段 2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯) 3.进程打开的文件描述符 4.信号的处理器 5.进程的当前目录和进程用户ID与进程组ID 线程的私有资源:(线程实现并发性)       1

线程分离状态

分离状态的线程, 不能用pthread_join()等待它的终止状态. 例1:  修改属性, 创建分离状态线程 mypthread_attr_detach.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <pthread.h> //gcc -g mypthread_attr_detach.c -o mypthread_

linux线程控制&amp;线程分离

线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程资源 由于一个程序中的多个线程共享同一地址空间,因此代码段,数据段内容是共享的.除此之外,以下内容也是共享的: 1. 文件描述符表2. 每种信号的处理方式(SIG_IGN.SIG_DFL