Linux中的线程的创建与回收

  • 线程创建
    • pthread_creat函数
  • 线程回收
    • pthread_join函数 && pthread_detach函数
  • 参考博客

线程创建

1.为什么引入线程

  • 进程在切换时系统开销大
  • 很多做操作系统引入了轻量级进程(LWP)
  • 同一线程共享相同的地址空间
  • Linux本质上不区分进程、线程

2. 进程与线程的区别

  • 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。这里主要强调独立进程有独立的地址空间,Linux为每个进程创建task_struct。每个进程都参与内核调度,互不影响。

  • 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈,下面会细说),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

  • 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

3. 使用线程的好处

  • 大大提高了任务切换的效率
  • 避免了额外的TLB&cache的刷新
每个线程共享的资源                    每个线程私有的资源- 可执行的指令                         - 线程ID(TID)- 静态数据                             - PC(程序计数器)和相关寄存器- 进程中打开的文件描述符                - 堆栈- 当前的工作路径                       - 错误号(errno)- 用户ID                            - 优先级- 用户组ID                            - 执行状态和属性

pthread_creat函数

#include <pthread.h>
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
void *(*start_rtn)(void*),void *arg);
/*C99中将第一个参数限定为restrict  restrict 限定符,表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.
*/
  • 成功时返回0,失败时返回错误码
  • 第一个参数 : thread 线程对象
  • 第二个参数 : 线程属性,NULL代表默认属性
  • 第三个参数 :线程执行的函数
  • 第四个参数 :执行函数的参数

这里着重说一下第二个参数,我们可以看到第二个参数的类型是pthread_attr_t指针类型下面具体说一下

typedef struct
{int    detachstate;           //线程的分离状态int    schedpolicy;            // 线程调度策略structsched_param      schedparam;    //线程的调度参数int    inheritsched;          //线程的继承性int    scope;                 //线程的作用域size_t     guardsize;         //线程栈末尾的警戒缓冲区大小int    stackaddr_set;void*    stackaddr;           //线程栈的位置size_t     stacksize;          //线程栈的大小
}pthread_attr_t;
  • __detachstate —— 表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步与回收,且在退出时自行释放所占用的资源。缺省为 PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为 PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到 PTHREAD_CREATE_JOINABLE状态。这个属性与线程回收相关,下面会细讲两种状态的区别。
  • __schedpolicy——表示新线程的调度策略,主要包括 SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和 SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过 pthread_setschedparam()来改变。
  • __schedparam——一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR 或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
  • __inheritsched——有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和 调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
  • __scope——表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值: PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同 进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
  • __stacksize——表示线程栈的大小,若不指定则默认为ulimit 中的 stack大小。一般来说是8388608字节。如果是嵌入式开发的话,一般需要通过pthread_attr_setstacksize重新设置值。否则可能创建失败返回12错误码(ENOMEM ).。

pthread_attr_t结构中还有一些值,但不使用pthread_create()来设置。

线程回收

pthread_join函数 && pthread_detach函数

int pthread_join(pthread_t thread, void **retval);int pthread_join(pthread_t thread, void **retval);

这里线程的回收与进程的类似。一个线程对应一个pthread_join()调用,对同一个线程进行多次pthread_join()调用是逻辑错误。join函数只能回收 PTHREAD_CREATE_JOINABLE状态的线程。其他状态不可以。当线程处于PTHREAD_CREATE_JOINABLE状态时,如果线程结束运行还没有被回收,则它的 状态类似于进程中的Zombie Process(僵尸进程),还有一部分的资源没有被系统回收(退出状态码),所以要调用pthread_join函数等待要结束的线程,并可以的到线程退出的状态码。
那么上述就可以发生线程没执行完,就执行到join函数,调用者会被阻塞,直到线程执行完成并且回收。但是有时候我们不希望因线程未执行完而被阻塞。比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码

pthread_detach(pthread_self())

或者父线程调用

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

这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。

最后关注我,点个赞再走吧(๑>؂<๑)

参考博客

[1] https://blog.csdn.net/tongxinhaonan/article/details/42558561
[2] http://zhaojunjie.blog.51cto.com/5475365/1033968
[3] https://baike.baidu.com/item/pthread_detach

Linux线程的创建与回收相关推荐

  1. linux线程的创建与删除

    linux线程的创建与删除 使用linux线程时,编译时需要包含-pthread选项. Linux通用API返回0表示成功,返回-1表示失败,并设置errno以标识错误原因.但Pthreads相关的A ...

  2. Linux 线程的创建与同步

    Linux 线程的创建与同步 1.线程的定义 2.线程的创建和使用 3.理解线程的并发运行 3.线程同步 3.线程的实现 1.线程的定义 线程:进程内部的一条执行路径.是资源调度和执行的基本单位. 进 ...

  3. Linux线程退出、资源回收、资源清理的方法

    首先说明线程中要回收哪些资源,理解清楚了这点之后在思考资源回收的问题. 1.子线程创建时从父线程copy出来的栈内存; 线程退出有多种方式,如return,pthread_exit,pthread_c ...

  4. 浅析Linux线程的创建

    本文首先使用了接口pthread_create创建一个线程,并用strace命令追踪了接口pthread_create创建线程的步骤以及涉及到的系统调用,然后讨论了Linux中线程与进程关系,最后概述 ...

  5. 一个简单的linux线程池

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  6. linux线程为什么也称为轻量级进程

    在Linux系统中,进程作为系统资源分配的最小单位,而线程作为系统调度的最小单位.也就是说,线程更加接近执行体的概念.但是线程和进程各自有优缺点,进程方便系统资源的管理与维护,但是执行创建进程的系统开 ...

  7. linux c 线程的创建、线程等待、线程终止、线程分离

    1. 什么是线程   线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...

  8. linux 线程退出资源回收,有关linux线程资源回收的有关问题

    有关linux线程资源回收的问题 使用linux c编程的,开启一个线程,这个线程中申请了一些资源.如果需要这个线程马上取消并且回收申请的资源怎么办啊? 前面使用了pthread_cancel()这个 ...

  9. Linux C线程的创建和使用

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  10. Linux线程——线程创建和基本使用(多线程并发)

    1.线程的概念与实现方式 1.1 线程的概念 概念:线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程.线程是进行资源调度和分配的基本单位 . (1)每个进程至少有一条执行路径,所以一个 ...

最新文章

  1. 「x is All You Need」,当学术论文开始标题党……
  2. 推荐陈永真著作《高效率开关电源设计与制作》
  3. 方舟子:如何避免学术不端行为(zz)
  4. 2018/Province_Java_C/1/哪天返回
  5. 时序分析:Kalman滤波(状态空间)
  6. CF758 D. Ability To Convert 细节处理字符串
  7. 马上工作了,想问下要注意哪些问题?
  8. 层间距离对ct图像的影响_CT专业知识掌握基础、了解原理
  9. 一些比较恶心的代码片段
  10. mount error 12 = Cannot allocate memory
  11. 2018计算机专业考研34所,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...
  12. 自学python能干些什么副业-她把摄影当副业:月薪3000,副业收入上万
  13. python将多个pdf合并并保存书签
  14. python绘制基因结构图_使用TBtools绘制进化树+motif分析+基因结构~三图合一
  15. 进店率、提袋率、客单价
  16. ret2csu ROP Emporium
  17. SpringDataJPA入门
  18. for,while,do...while循环语句的基本知识
  19. html css 中浮动影响与浮动问题的解决
  20. 真实案例:一个渠道、一本书,狠狠赚了200万

热门文章

  1. 商城管理系统源码 商城APP源码 电子商城源码
  2. 离散事件系统仿真(第五版)
  3. List转JSON格式方法
  4. rx560d linux 图形设计,RX 560D对比RX 560哪个好?RX560D与560的区别对比详细评测
  5. 流畅的python是python3吗_流畅的 Python - 3. 文本与
  6. k3刷机 重置_斐讯K3刷LEDE固件成功刷机教程
  7. Java应用分层(阿里巴巴Java开发手册)
  8. 几款主流电子电路仿真软件优缺点比较
  9. 处理分页 上一页 下一页首页 末页问题
  10. 基于统计学的商务与经济数据分析知识