`

线程分离

 
阅读更多
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() 函数来对其进行资源回收。
分享到:
评论

相关推荐

    QT/C++ TCP多线程客户端(收发线程分离,自动粘包处理,自动数据包成型)

    因此,通过使用多线程,我们可以将接收和发送操作分离开,以提高系统的并行处理能力。 1. **多线程模型**:在本项目中,采用了两种线程来处理不同的任务——一个用于接收数据,另一个用于发送数据。这种设计可以...

    python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    ### Python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例 #### 背景介绍 在进行GUI程序设计时,一个重要的原则是将用户界面(UI)的操作与其他耗时任务(如网络请求、数据库操作、大量计算等)分离...

    多线程(22)读写锁分离模式1

    总结来说,读写锁分离模式通过分离读锁和写锁,使得在多线程环境下,读操作可以并行执行,写操作保持互斥,从而优化了并发访问的效率。Java的`java.util.concurrent.locks.ReadWriteLock`接口提供了一种标准的实现...

    qt 中 多线程tcp通信

    在Qt框架下实现多线程TCP通信是一种常见且高效的方法,尤其在处理实时性要求高、数据量大的网络应用中。以下将详细讲解Qt中如何进行多线程TCP通信,以及涉及的关键知识点。 首先,标题"qt 中 多线程tcp通信"表明...

    QT 多线程TCP服务器与客户端

    QT框架中的多线程TCP服务器与客户端编程是一个关键的领域,尤其在开发高效、响应迅速的网络应用时。本文将深入探讨如何利用QT库,特别是QT5.11.1版本,来构建多线程的TCP服务器和客户端,以及QThread在其中的作用。 ...

    C++ 等待线程结束

    `detach()`会将线程与调用线程分离,不再与调用线程有任何关联。这样,调用线程不会等待被分离的线程结束,而是立即继续执行。然而,分离的线程一旦开始执行,其生命周期就独立于创建它的线程,如果忘记`join()`或`...

    LINUX线程函数大全.pdf

    LINUX 线程函数大全是一个详细的线程函数手册,涵盖了线程创建、线程属性、线程结束、线程等待、线程分离、线程数据等多方面的知识点。本手册将详细讲解每个线程函数的使用方法、参数设置、返回值等信息,从而帮助...

    elasticsearch-engine:es translog 从索引线程分离出去

    **Elasticsearch Engine:ES Translog 从索引线程分离出去** 在深入探讨Elasticsearch(ES)引擎中translog(事务日志)与索引线程的分离之前,我们首先需要理解这两个核心概念。 **1. Elasticsearch概述** ...

    CC++多线程编程练习题大全

    8. **线程 join 和 detach**:`join`方法使得主线程等待子线程完成,`detach`则将线程分离,不再与主线程关联,线程结束时资源会自动回收。 9. **死锁**:当两个或更多线程相互等待对方释放资源而陷入僵局时,发生...

    linux多线程设计及示例

    4. **线程分离** `pthread_detach`函数将一个线程设置为脱离状态。脱离线程在结束时会自动清理资源,无需其他线程调用`pthread_join`。线程可以调用`pthread_detach(pthread_self())`使其自身变为脱离状态。 5. **...

    POSIX多线程程序设计随书源码

    4. **线程分离**:`pthread_detach`函数可以将线程设置为分离状态,一旦线程结束,其资源会自动释放,无需再调用`pthread_join`。 5. **线程属性**:`pthread_attr_t`结构体用于设置线程的属性,如调度策略、栈大小...

    linux多线程编程.pdf

    * 使用 pthread_detach 函数将线程分离,允许线程独立地执行。 线程的继承性: * 使用 pthread_inheritsched 函数继承线程的调度策略。 线程的调度策略: * 使用 sched_setscheduler 函数设置线程的调度策略。 *...

    创建多线程线程同步

    3. GUI程序:UI线程与后台工作线程分离,避免界面卡顿。 4. 文件操作:多线程读写同一文件,需要同步防止数据交错。 总结,多线程和线程同步是提高程序效率和解决并发问题的关键技术。理解并掌握CEVENT对象等同步...

    分离状态创建线程

    若不关心线程的结束状态,可以使用`pthread_detach()`函数将线程设置为分离状态,或者在创建线程时通过设置线程属性`detachstate`为`PTHREAD_CREATE_DETACHED`使其从一开始就成为分离线程。 总结来说,线程的分离...

    线程基本编程——线程函数大全.doc

    pthread_detach 函数用于将一个线程分离出来,使其不再与其他线程共享资源。该函数需要一个参数:线程的 Thread ID。 例如: ```c pthread_t tid; int ret = pthread_detach(tid); if (ret != 0) { perror(...

    Qt创建线程的两种方式+线程池方式

    优点:对象与线程分离,使得线程逻辑和对象逻辑分离,提高了代码的可维护性和灵活性;可以将一个对象移动到多个线程中,实现线程间的数据共享和交互;可以使用信号和槽机制在对象和线程之间进行通信。 缺点:需要...

    Solaris多线程编程指南

    - **分离线程**: 将线程分离,使其成为守护线程,不再需要显式等待它结束。 - **为线程特定数据创建键** - **线程特定数据(TSD)**: 为每个线程分配独立的数据存储空间。 - **创建TSD键**: 使用`pthread_key_...

    QThread.rar_QT_QT 多线程_QThread 多线程_qthread_qt多线程

    为了将UI对象与工作线程分离,可以使用`moveToThread()`函数。这样,当线程运行时,关联的对象将在该线程的上下文中运行,避免了UI线程被阻塞。 ```cpp MyThread *myThread = new MyThread; QObject::connect...

    java多线程迷宫生成程序

    1. **线程分离**:生成迷宫的算法可能被分配到不同的线程中,每个线程负责创建一部分迷宫。这样可以加快整体生成速度,特别是在复杂的迷宫结构中。 2. **动画更新**:另一个线程可能负责定期更新屏幕显示,展示迷宫...

    c++实现多线程同步

    4. **线程分离**:调用`std::thread::detach()`或`std::thread::join()`方法。前者让线程独立运行,而后者会等待该线程结束才继续执行主线程。 5. **线程销毁**:当线程运行完毕或被显式终止,线程对象会被销毁。 ...

Global site tag (gtag.js) - Google Analytics