首页 > 其他分享 >线程管理

线程管理

时间:2023-08-18 15:26:16浏览次数:27  
标签:结束 函数 管理 int 线程 pthread 进程

一、基本概念

1、线程是进程的执行路线,它是进程内部的控制序列,线程是进程的一部分,进程是一个资源单位,而线程是执行单位,线程是进程执行的实体,负责真正的执行

2、线程是轻量级的,没有自己的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前工作目录等资源,进程中的所有线程都共享以上资源

3、每个线程都有自己独立的栈内存、线程ID、错误码、信号掩码、程序计数器、调度的优先级

4、一个进程中可以包含多个线程(多条不同的执行路线),但是至少要有一个线程,进程刚创建成功时必定有一个线程,也称为主线程

5、ps -T -p 查看进程pid的线程信息,还可以htop命令查看

6、线程是进程的实体,可作为系统独立的任务调度和分配的基本单位

7、线程有不同的状态,系统提供了线程的控制接口,例如:创建、销毁、控制等

8、进程中的所有线程都在同一个虚拟地址空间中工作,进程中的所有资源对于它的线程来说都是共享的,尽管线程有属于自己的栈内存等资源,但是没有添加保护机制,对于其它线程的这些资源是可见的,当多个线程协同工作时需要解决的首要问题是资源竞争的问题(上锁)

9、线程的系统开销小、任务的切换速度快,同进程的多个线程之间不需要数据交换、也就不需要类似进程间通信的机制进行线程间通信,因此使用线程相对简单而高效

10、线程之间有优先级之分

二、POSIX线程

1、早期的UNIX和早期的Linux是没有线程概念的,微软的Windows系统首先使用的线程概念,之后UNIX和Linux也逐渐增加使用线程

2、早期各个厂商都提供自己私有的线程库,各自的接口实现差异比较大,不易于移植,世界标准化组织1995年指定了统一的线程接口规范,遵循这套标准的线程统称为POSIX线程,简称pthread

3、pthread包含一个头文件 pthread.h 和一个共享库 libpthread.so

-lpthread 编译参数

三、线程管理

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
    功能:创建线程
    thread:输出型参数,用于获取线程ID
    attr:线程属性,一般不设置属性给NULL即可
    start_routine:线程的执行入口函数,类似于该线程的主函数main
    arg:传递给入口函数的参数
    返回值:成功0,失败返回错误编码

注意:入口函数的参数和返回值要确保它们的持久化,方法1:使用全局变量参数,方法2:赶在参数释放前,把参数的值立即保存到入口函数的栈内存中

注意:从表面上看当主线程结束后,子线程也会随之一起结束,但实际上子线程之所以结束是因为主线程执行了main函数中隐藏的return语句,导致整个进程结束,所有线程都属于进程的一部分,会随着进程一起被结束回收,假如只是通过pthread_exit只结束主线程,子线程不会随着主线程结束的

注意:子线程执行入口函数结束后,子线程也结束了

int pthread_join(pthread_t thread, void **retval);
   功能:等待线程结束,并获取结束时入口函数的返回值、释放线程资源
   thread:要等待的线程ID
   retval:用于获取线程结束时返回值的地址
   返回值:成功0,失败返回错误编码,等待线程还未结束则阻塞
int pthread_equal(pthread_t t1, pthread_t t2);
    功能:判断两个线程id是否相同,相同返回非零,不相同返回0
    注意:部分系统中的线程ID是以结构实现的,因此不能直接使用==运算符
pthread_t pthread_self(void);
   功能:获取当前线程的线程ID

四、线程的执行轨迹

同步方式:可结合状态(joinable) 默认的

在使用默认属性创建线程时,线程属于joinable态,该类线程必须在另一个线程中使用pthread_join函数等待其结束并释放线程资源,如果该类线程在结束时没有任何线程执行pthread_join回收其资源,该线程就变成"僵尸线程"。每个"僵尸线程"都会消耗一些系统资源,当有太多的"僵尸线程"存在时,可能会导致创建线程失败

异步方式:分离状态(detach)

当把线程设置为detach态时,线程结束无需经过pthread_join函数回收资源,由系统负责回收资源

注意:为了避免线程资源的泄漏,要么显式地调用pthread_join回收资源,或者设置为detach态

    int pthread_detach(pthread_t thread);
        功能:让线程分离,变成detach态
        thread:想要变成detach态的线程id
            两种方式:
            1、线程自己调用
                pthread_detach(pthread_self())
            2、其他线程(创建者)
                pthread_detach(threadid);
        注意:如果先执行了pthread_join进入等待后,才对线程进行分离,join不会立即结束,而是一直等到线程结束才返回

五、线程的终止

1、线程执行完入口函数的最后一行代码

2、线程调用pthread_exit函数,结束该线程

void pthread_exit(void *retval);
功能:向本线程发出取消请求,如果响应该请求,则线程会终止
retval:线程入口函数的返回值,会返回给pthread_join

3、如果进程结束(前三种情况),那么它所有的线程都会随之结束

4、向指定的线程发出取消请求

int pthread_cancel(pthread_t thread);
默认情况下都会响应取消请求
thread:要杀死的线程id

六、线程的属性

    pthread_attr_t的定义:
    typedef struct
    {
       int                       detachstate;     线程的分离状态
       int                       schedpolicy;     线程调度策略
       struct sched_param        schedparam;      线程的调度参数
       int                       inheritsched;    线程的继承性
       int                       scope;           线程的作用域
       size_t                    guardsize;       线程栈末尾的警戒缓冲区大小
       int                       stackaddr_set;
       void *                    stackaddr;       线程栈的位置
       size_t                    stacksize;       线程栈的大小
    }pthread_attr_t;

通过 pthread_attr_setxxx 设置线程相关属性

通过 pthread_attr_getxxx 获取线程相关属性

标签:结束,函数,管理,int,线程,pthread,进程
From: https://www.cnblogs.com/wangqiuji/p/17640590.html

相关文章

  • 水资源智慧管理:数字孪生引领水务变革
    智慧水务中,数字孪生有着深远的作用,正引领着水资源管理和环境保护的创新变革。随着城市化和工业化的不断推进,水资源的可持续利用和管理愈发显得重要,而数字孪生技术为解决这一挑战提供了独特的解决方案。数字孪生技术,将实际的水务系统与数字虚拟模型相结合,实现了对水资源的实时监测......
  • 数据治理不规范!国家金融监督管理总局开具多张银行罚单
    2023年8月4日,国家金融监督管理总局开具了两张银行罚单:宁波慈溪农村商业银行被罚款330万元,主要违法违规行为包括数据治理不完善;东莞银行深圳分行因数据治理不到位等2项主要违法违规行为,被罚款90万元,并被没收违法所得87773.73元。这些行政处罚并不是个例,此前就有多家银行在数据治理方......
  • 【8月19日】红帽openstack管理课程(CL210) 新一轮开课
    课程介绍通过实验室操作练习,学员将能够深入学习红帽企业LinuxOpenStack®平台各服务的手动安装方法,还将了解OpenStack开发社区的未来发展计划。培训地点:线下面授:苏州市姑苏区干将东路666号和基广场401室;远程直播:腾讯会议平台开课时间:2023年8月19日开始—9月16日结束课程对象负......
  • 2023北京/杭州/深圳CSPM-3国标项目管理中级认证招生
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 2023下半年北京/杭州/深圳软考信息系统项目管理师报名
    信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。信息系统项目管理师,属于软考三个级别中的“高级”。  【报考要求】 不设学历与资历......
  • 基于工业互联网平台实现砻谷机远程运维管理
    随着农业技术的不断发展,物联网技术在农业领域的应用越来越广泛。其中,砻谷机作为农业生产中的重要设备,实现其远程监控和运维管理对于提高农业生产效率具有重要意义。 PLC在砻谷机中发挥着核心控制作用。通过编写程序,PLC可以控制砻谷机的各个动作,实现自动化工作。因此通过PLC数据采......
  • C#程序变量统一管理例子 - 开源研究系列文章
            今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。        我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为:1)窗体;2)路径;3)对象;所以笔者对这几个库进行......
  • Flexsim项目:MC公司下游仓库管理仿真实验
    完整项目下载:下载链接1问题与概念模型描述1.1问题描述本次管理业务流程是以德国MC公司为研究对象,主要研究该公司的下游成品仓库管理。德国MC公司创立于1961年,公司创立支出就明确以保护、维护、养护和修复混凝土为他们的开发、生产目标,经过公司的不懈努力,MC公司已是当今世界......
  • java开发工具idea连接aws账号管理
    一:下载插件awstoolkit二:登录亚马逊账号拿到密钥信息三:设置idea连接地区配置idea连接信息aws密钥重启idea左下侧可用 下载aws插件  配置亚马逊区域选择这个必须和账号配对(一致地区) 去亚马逊官网获取密钥信息     这些都配置完后重启......
  • 交通枢纽智能可视化综合管理系统解决方案
    一、行业需求交通枢纽是城市管理中一个典型的跨应用场景,如铁路、公路、航空、内河航运、海港等,人流、车流量较多,环境复杂,易发生突发情况,因此安全和安保是非常重要的考虑因素。交通枢纽的运营管理体系建设需要考虑到人员疏散、消防设施、监控系统等方面的安全要求,以防止恐怖袭击和其......