- 浏览: 768802 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
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() 函数来对其进行资源回收。
线程的分离与结合
在任何一个时间点上,线程是可结合的(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() 函数来对其进行资源回收。
发表评论
-
滑动窗口与拥塞控制
2017-09-29 14:47 762滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 987testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 511#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 618#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 665#include <stdio.h> #in ... -
netfilter
2016-10-04 20:31 484http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 419注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 425各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
log
2015-03-30 17:42 457log.h #ifndef __LOG_H__ #def ... -
TIMEWAIT与CLOSEWAIT
2015-03-17 11:32 665http://blog.csdn.net/kobejayand ... -
TcpClient
2015-01-16 17:46 476TcpClient.h #ifndef TCPCLIENT ... -
信号量
2014-09-26 10:20 687#include <semaphore.h> ... -
共享内存
2014-09-17 10:39 605SharedMemory.h #ifndef SHARED ... -
记录锁
2014-09-11 16:32 442#include <errno.h> #in ... -
popen
2014-09-06 14:50 643#include <stdio.h> #in ... -
大小端存储
2014-09-05 09:29 609#include <stdio.h> i ... -
条件变量(cond)
2014-09-01 11:02 887#include <pthread.h> # ... -
读写锁
2014-09-01 10:33 735#include <pthread.h> # ... -
trylock
2014-09-01 10:07 674#include <pthread.h> # ... -
线程返回值传出
2014-08-31 09:56 538#include <pthread.h> # ...
相关推荐
因此,通过使用多线程,我们可以将接收和发送操作分离开,以提高系统的并行处理能力。 1. **多线程模型**:在本项目中,采用了两种线程来处理不同的任务——一个用于接收数据,另一个用于发送数据。这种设计可以...
### Python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例 #### 背景介绍 在进行GUI程序设计时,一个重要的原则是将用户界面(UI)的操作与其他耗时任务(如网络请求、数据库操作、大量计算等)分离...
总结来说,读写锁分离模式通过分离读锁和写锁,使得在多线程环境下,读操作可以并行执行,写操作保持互斥,从而优化了并发访问的效率。Java的`java.util.concurrent.locks.ReadWriteLock`接口提供了一种标准的实现...
在Qt框架下实现多线程TCP通信是一种常见且高效的方法,尤其在处理实时性要求高、数据量大的网络应用中。以下将详细讲解Qt中如何进行多线程TCP通信,以及涉及的关键知识点。 首先,标题"qt 中 多线程tcp通信"表明...
QT框架中的多线程TCP服务器与客户端编程是一个关键的领域,尤其在开发高效、响应迅速的网络应用时。本文将深入探讨如何利用QT库,特别是QT5.11.1版本,来构建多线程的TCP服务器和客户端,以及QThread在其中的作用。 ...
`detach()`会将线程与调用线程分离,不再与调用线程有任何关联。这样,调用线程不会等待被分离的线程结束,而是立即继续执行。然而,分离的线程一旦开始执行,其生命周期就独立于创建它的线程,如果忘记`join()`或`...
LINUX 线程函数大全是一个详细的线程函数手册,涵盖了线程创建、线程属性、线程结束、线程等待、线程分离、线程数据等多方面的知识点。本手册将详细讲解每个线程函数的使用方法、参数设置、返回值等信息,从而帮助...
**Elasticsearch Engine:ES Translog 从索引线程分离出去** 在深入探讨Elasticsearch(ES)引擎中translog(事务日志)与索引线程的分离之前,我们首先需要理解这两个核心概念。 **1. Elasticsearch概述** ...
8. **线程 join 和 detach**:`join`方法使得主线程等待子线程完成,`detach`则将线程分离,不再与主线程关联,线程结束时资源会自动回收。 9. **死锁**:当两个或更多线程相互等待对方释放资源而陷入僵局时,发生...
4. **线程分离** `pthread_detach`函数将一个线程设置为脱离状态。脱离线程在结束时会自动清理资源,无需其他线程调用`pthread_join`。线程可以调用`pthread_detach(pthread_self())`使其自身变为脱离状态。 5. **...
4. **线程分离**:`pthread_detach`函数可以将线程设置为分离状态,一旦线程结束,其资源会自动释放,无需再调用`pthread_join`。 5. **线程属性**:`pthread_attr_t`结构体用于设置线程的属性,如调度策略、栈大小...
* 使用 pthread_detach 函数将线程分离,允许线程独立地执行。 线程的继承性: * 使用 pthread_inheritsched 函数继承线程的调度策略。 线程的调度策略: * 使用 sched_setscheduler 函数设置线程的调度策略。 *...
3. GUI程序:UI线程与后台工作线程分离,避免界面卡顿。 4. 文件操作:多线程读写同一文件,需要同步防止数据交错。 总结,多线程和线程同步是提高程序效率和解决并发问题的关键技术。理解并掌握CEVENT对象等同步...
若不关心线程的结束状态,可以使用`pthread_detach()`函数将线程设置为分离状态,或者在创建线程时通过设置线程属性`detachstate`为`PTHREAD_CREATE_DETACHED`使其从一开始就成为分离线程。 总结来说,线程的分离...
pthread_detach 函数用于将一个线程分离出来,使其不再与其他线程共享资源。该函数需要一个参数:线程的 Thread ID。 例如: ```c pthread_t tid; int ret = pthread_detach(tid); if (ret != 0) { perror(...
优点:对象与线程分离,使得线程逻辑和对象逻辑分离,提高了代码的可维护性和灵活性;可以将一个对象移动到多个线程中,实现线程间的数据共享和交互;可以使用信号和槽机制在对象和线程之间进行通信。 缺点:需要...
- **分离线程**: 将线程分离,使其成为守护线程,不再需要显式等待它结束。 - **为线程特定数据创建键** - **线程特定数据(TSD)**: 为每个线程分配独立的数据存储空间。 - **创建TSD键**: 使用`pthread_key_...
为了将UI对象与工作线程分离,可以使用`moveToThread()`函数。这样,当线程运行时,关联的对象将在该线程的上下文中运行,避免了UI线程被阻塞。 ```cpp MyThread *myThread = new MyThread; QObject::connect...
1. **线程分离**:生成迷宫的算法可能被分配到不同的线程中,每个线程负责创建一部分迷宫。这样可以加快整体生成速度,特别是在复杂的迷宫结构中。 2. **动画更新**:另一个线程可能负责定期更新屏幕显示,展示迷宫...
4. **线程分离**:调用`std::thread::detach()`或`std::thread::join()`方法。前者让线程独立运行,而后者会等待该线程结束才继续执行主线程。 5. **线程销毁**:当线程运行完毕或被显式终止,线程对象会被销毁。 ...