线程的分离

  1. 基础知识

默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该被显示回收,即调用pthread_join,或通过调用pthread_detach函数被分离。

1)如果一个可结合线程运行结束但没有被join,则它的状态类似与僵尸进程。

2)若调用pthread_join后,该线程还没有结束运行,调用者会被阻塞。为了避免此现象,可在子线程中加入代码

pthread_detach(pthread_self())

或者父线程调用

pthread_detach(thread_id)(非阻塞,可立即返回)

这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。

2.代码实现

  //detach.c
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 
  5 void* thread_run(void* val)
  6 {
  7     pthread_detach(pthread_self());
  8     printf("%s\n",(char*)val);
  9     return NULL;
 10 }
 11 int main()
 12 {
 13     pthread_t tid;
 14     int tret=pthread_create(&tid,NULL,thread_run,"thread_run run...");
 15     if(tret!=0) 
 16     {
 17         printf("create pthread error!,info is:%s\n",strerror(tret));
 18         return tret;
 19     } 
 20     int ret;
 21     sleep(1); 
 22     if(0==pthread_join(tid,NULL)) 
 23     {
 24         printf("thread wait success!\n");
 25         ret=0;
 26     }
 27     else
 28     {
 29         printf("pthread wait failed!\n");
 30         ret=1;
 31     }
 32     return ret;
 33 }
 
 //makefile
  1 detach:detach.c
  2     gcc -o [email protected] $^ -lpthread
  3 .PHONY:clean
  4 clean:
  5     rm -f detach

输出结果:

时间: 2024-10-17 06:52:06

线程的分离的相关文章

线程的分离与结合

原文地址:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.html 线程的分离与结合     在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己

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

以下内容引用自: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和一个计算结果,然后终止线程 定义线程变量,属性对象变量和一些常见变量.属性对象变量可以根据自己的需求来设置,从而通过属性对象来设置线程的属性,在这里主要是设置线程的结合和分离属性. 对属性对象变量进行初始化,并

线程的控制和分离

线程的概念:线程是运行在进程内的一个基本执行流,和进程共享地址空间及资源(类似于父子进程共享地址空间),但每个也有自己的私有资源. 进程强调独占性 每个进程都有它独立的地址空间,包括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