pthread_detach()与pthread_join的区别?

简单来说: pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收。pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源。

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

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

[cpp]

int pthread_join(pthread_t tid, void**thread_return);

若成功则返回0,若出错则为非零。

int pthread_join(pthread_t tid, void**thread_return);

若成功则返回0,若出错则为非零。    线程通过调用pthread_join函数等待其他线程终止。pthread_join函数分阻塞,直到线程tid终止,将线程例程返回的(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有存储器资源。[cpp] view plaincopyprint?int pthread_detach(pthread_t tid);

若成功则返回0,若出错则为非零。

int pthread_detach(pthread_t tid);

若成功则返回0,若出错则为非零。

pthread_detach用于分离可结合线程tid。线程能够通过以pthread_self()为参数的pthread_detach调用来分离它们自己。

如果一个可结合线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。

由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的连接请求),这时可以在子线程中加入代码

pthread_detach(pthread_self())

或者父线程调用

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

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

时间: 2024-08-30 11:06:39

pthread_detach()与pthread_join的区别?的相关文章

简单的线程消息队列实现

1. 线程使用场景(1)流水线方式.根据业务特点,将一个流程的处理分割成多个线程,形成流水线的处理方式.产生的结果:延长单一流程的处理时间,提高系统整体的吞吐能力.(2)线程池方式.针对处理时间比较长且没有内蕴状态的线程,使用线程池方式分流消息,加快对线程消息的处理,避免其成为系统瓶颈.线程使用的关键是线程消息队列.线程锁.智能指针的使用.其中以线程消息队列最为重要. 2. 线程消息队列描述所谓线程消息队列,就是一个普通的循环队列加上“多生产者-单(多)消费者的存/取操作”.流水线方式中的线程是

线程的那些事

线程的那些事 前言:这篇文章主要小结下linux下多线程的知识点,并且有一些多线程编程中的拓展概念.以及c语言编写线程池的思路 linux线程简介 线程的私有数据和公有数据 线程的上下文切换 创建线程 线程终止 互斥量 条件变量 多线程概念简单拓展 竟态条件 并发与并行 同步与互斥 volatile CAS(compare and swap) 指令重排和内存屏障 c语言实现线程池思想 linux线程简介 系统中的进程在某些情况下并不能满足我们的需求,比如一个操作系统创建进程的数量非常有限,进程的

分离式线程

1.技术都是为了解决实际问题的,考虑下面的场景: 主线程创建一个子线程,子线程做一些任务,在主线程上,等待子线程完成任务,然后向下运行.代码如下: #include <stdio.h> #include <pthread.h> #include <unistd.h> void* FuncA(void* arg) { printf("FuncA Time[%d]\n", time(NULL)); sleep(2); } int main(int arg

线程分离设置

PTHREAD_ATTR_SETDETACHSTATELinux Programmer's MaPTHREAD_ATTR_SETDETACHSTATE(3) NAME        pthread_attr_setdetachstate,   pthread_attr_getdetachstate   -  set/get        detach state attribute in thread attributes object SYNOPSIS        #include <pth

【转】c++ 多线程

C++ 多线程 C++ 本篇博客主要介绍C++ 的多线程机制. 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多任务处理是程序的并发执行. 线程的多任务处理是同一程序的片段的并发执行. 多线程程序包含可以同时运行的两个或多个部分.这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径. C++ 不包含多线程应用程序的任何内置支持.相反,它完全依赖于操作系统来提供此功能. 本教程假

C++学习笔记(六):高级编程:模板,预处理器,信号处理,多线程,Web编程

模板 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式. 库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如vector <int>和vector <string>. 您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用. 函数模板 模板函数定义的一般形式如下所示: template <class type>

c++ Pthread创建线程后必须使用join或detach释放线程资源

http://www.cppblog.com/prayer/archive/2012/04/23/172427.html 这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach): Either pthread_join(3) or pthread_detach() should be called for each thread that an application creates, so that system resources for the

2线程原语:pthread_create(),pthread_self(),pthread_exit(),pthread_join(),pthread_cancel(),pthread_detach(

 1  pthread_create()函数 创建线程 A:依赖的头文件 #include<pthread.h> B:函数声明 int pthread_create(pthread_t *thread, constpthread_attr_t *attr, void *(*start_routine) (void *), void *arg); pthread_t *thread:传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID) const pthread_att

pthread_join与pthread_detach细节问题

http://www.360doc.com/content/13/0106/09/9171956_258497083.shtml pthread_t    pthr; pthread_create(&pthr, NULL, thread_handler, NULL); ... void* thread_handler(void* arg) { /* do something */ pthread_join(pthr, NULL); } 上面的代码不好使,pthread_join不能放在pthre