Linux线程:线程分离

目录

一、什么是线程分离

1.1pthread_detach

 1.2pthread线程库存在的意义

1.3__thread线程的局部存储

1.4系统调用clone


一、什么是线程分离

1.1pthread_detach

默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。
int pthread_detach(pthread_t thread);
可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离 :
pthread_detach(pthread_self());//对自己进行分离
joinable和分离是冲突的,一个线程不能既是joinable又是分离的。

而为什么要有线程分离或者是为什么要将线程进行分离呢?我们在运行或者打开一个软件或应用时,往往我们不去主动关闭,该线程一般是不会主动进行退出的,所以一般情况下主线程都是常驻的而在我们需要去进行其他操作时再由主线程去创建其他新线程,所以主线程一般都是死循环运行的。而一般情况下我们都希望主线程是最后一个退出的。

所以线程分离底层依旧属于同一个进程,只是不需要进行等待了。

 1.2pthread线程库存在的意义

Linux中不存在真正的线程,线程底层都是用进程来进行模拟的,而之所以有线程是针对面向用户进行使用的,而Linux中的线程也被叫做用户级线程,所以在Linux中存在着一个线程库,库中则封装着由OS将线程转换成轻量级进程的具体方法。所以就要由OS提供一个库将线程进行封装,然后转换成用户习惯的使用方式为用户提供用户习惯的上层接口。

所以我们之前使用的pthread_t类型所表示的数字是什么呢?

我们可以在编写代码时,让代码拿到当前线程tid然后转换成16进制。

也可以通过指令去获取指定进程的LWP。

 但是通过观察可以发现,我们获取的tid和LWP并不一样。

而OS在代码刚开始运行时,首先创建的是一个进程,包括task_struct 、mm_struct 、页表。然后将磁盘中存储的代码加载到内存中然后进行运行。而我们在代码中创建线程,但系统中并没有线程的概念,只有轻量级进程的概念,但是又需要让用户看到并对线程进行操作,所以线程的创建管理等工作是在库中进行实现的,库中对各种操作进行了封装处理。而库也是一个文件存在于OS中

 而这个库就是一个动态库,而想要执行该库就需要先将其加载到内存中,然后将其映射到该进程的地址空间的共享区中,所以创建线程、等待线程、终止线程等等工作都是在库中进行实现的,所以库就要对用户创建的线程进行管理,而管理的方式一如既往是先描述,再组织。

而动态库就会如下图的方式一样被加载到进程的地址空间中,而线程也有自己的线程控制块TCB,而一般操作系统是不直接提供TCB数据结构的。

 所以创建一个线程就创建一个tcb,而每个tcb的起始地址就叫做线程的tid,所以系统提供给用户的线程的地址就是tcb的起始地址,通过该地址就能找到线程的所有属性信息。而tcb中就封装了该线程的LWP等信息。而库中不仅维护该线程所独立拥有的栈等,还会维护相关的数据结构。而线程的栈结构和上下文数据都是自己私有的。主线程的栈就在如图所示的地方,一旦开辟新的线程就会创建和分配新的栈结构,所以每个线程都有独立的栈结构。虽然线程间的栈结构是独立的,但其指向的都是同一进程的同一地址空间,所以彼此之间还是能够相互访问的。

这个库是一个动态库,也被叫做共享库,共享库可以通过页表被映射到每一个进程地址空间当中,所以不仅仅是一个进程,整个系统的所有进程中的线程,都由该库进行统一管理。

1.3__thread线程的局部存储

假设定义了一个全局变量int gvl;
__thread int gvl;
则可以对gvl的全局属性做修改,让它变成每个线程所私有的

全局变量一般存在于进程地址空间的初始化数据区,是所有线程所共享的,也就是说一个线程对其进行修改,所有的线程都能看到。如果这时在定义全局变量之前加上__thread就可以让该全局变量变成每个线程所私有的,从而不会受其他线程的影响。而这就叫做线程的局部存储。在代码编译时OS会将该变量单独拆解出来,存放到每一个线程的局部存储当中。注意,局部存储只可以存储内置类型,不能存储自定义类型。

1.4系统调用clone

在代码执行过程中,pcb在执行线程相关的代码时,也需要找到线程所对应的栈的位置,clone就可以解决这个问题,而clone就是pthread_create的底层实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339114.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点:使用场景: 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点:使用场景: 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…

LabVIEW步进电机的串口控制方法与实现

本文介绍了在LabVIEW环境中通过串口控制步进电机的方法,涵盖了基本的串口通信原理、硬件连接步骤、LabVIEW编程实现以及注意事项。通过这些方法,用户可以实现对步进电机的精确控制,适用于各种自动化和运动控制应用场景。 步进电机与串口通信…

【刷题(15】普通数组

一 普通数组基础 首先&#xff0c;我们根据下图先了解一下什么是前缀和。 既然我们明白了前缀和是怎么回事&#xff0c;那我们就来看一下我们该怎么输入 先给出答案&#xff0c;然后再给出分析。 答案&#xff1a; for (int i 1; i < n; i ){cin >> a[i];s[i] s…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…

DIYP对接骆驼后台IPTV管理,退出菜单中显示用户名已经网络信息,MAC,剩余天数,套餐名称等

演示&#xff1a;https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (访问密码: 8976) 后台加上EPG&#xff0c;增加一些播放源的动态端口替换。 前台app上&#xff0c;退出菜单中显示用户名已经网络信息&#xff0c;MAC&#xff0c;剩余天数&#xff0c;套餐名称…

QT之常用控件

一个图形化界面当然需要有各种各样的控件&#xff0c;QT也不例外&#xff0c;在QT designer中就有提供各种各样的控件&#xff0c;用以开发图形化界面。 而想使用好一个QT控件&#xff0c;就需要了解这些控件。 QWidget 在QT中&#xff0c;所有控件都继承自 QWidget 类&…

中间件模版引擎

文章目录 中间件1.自定义中间件1&#xff09;全局2&#xff09;局部中间件 2.内置中间件(静态资源目录&#xff09; Art-template1.模板语法1&#xff09;输出2&#xff09;原文输出3&#xff09;条件判断4&#xff09;循环5&#xff09;子模版6&#xff09;模版继承7&#xff…

git远程仓库限额的解决方法——大文件瘦身

Git作为世界上最优秀的分布式版本控制工具&#xff0c;也是优秀的文件管理工具&#xff0c;它赋予了项目成员对项目进行远程协同开发能力&#xff0c;因此受到越来越多的行业从业人员的喜爱。很多优秀的项目管理平台&#xff0c;比如国内的Gitee&#xff0c;国外的Github&#…

Django表单革命:打造安全、高效、用户友好的Web应用

Django表单处理&#xff0c;听起来是不是有点枯燥&#xff1f;别急&#xff0c;阿佑将带你领略Django表单的艺术之美。我们将以轻松幽默的语言&#xff0c;一步步引导你从表单的创建到管理&#xff0c;再到验证和自定义&#xff0c;让你在不知不觉中掌握Django表单的精髓。文章…

SpringMVC:转发和重定向

1. 请求转发和重定向简介 参考该链接第9点 2. forward 返回下一个资源路径&#xff0c;请求转发固定格式&#xff1a;return "forward:资源路径"如 return "forward:/b" 此时为一次请求返回逻辑视图名称 返回逻辑视图不指定方式时都会默认使用请求转发in…

留给“端侧大模型”的时间不多了

端侧大模型&#xff08;Edge AI models&#xff09;&#xff0c;也就是只在设备本地&#xff08;如智能手机、IoT设备、嵌入式系统等&#xff09;运行的大模型&#xff0c;过去一两年来非常流行。 具体表现在&#xff0c;终端设备厂商&#xff0c;如苹果、荣耀、小米、OV等&…

【操作与配置】VS2017与MFC环境配置

【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于软件开发人员和团队。使用此应用程序&#xff0c;您可以构建和调试现代Web应用程序&#xff0c;并利用扩展帮助探索几乎任何编程语言。…

重学java 55. 集合 Set接口

我救自己万万次&#xff0c;铮铮劲草&#xff0c;绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合&#xff0c;只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…

Docker 部署 mysql 服务

linux用法 Container&#xff08;容器&#xff09;集合成 Services&#xff08;服务&#xff09; 交互集合成 Stack&#xff08;堆栈&#xff09;卸载可能存在的旧版本 sudo apt-get update使apt可以通过HTTPS使用存储库&#xff08;repository&#xff09; sudo apt-get ins…

961操作系统知识总结

部分图片可能无法显示&#xff0c;参考这里&#xff1a;https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型&#xff1a;批处理操作系统(批量处理作业&#xff0c;单道批处理/多道批处理系统&#xff0c;用…

7. MySQL 视图、索引

文章目录 【 1. 视图 View 】1.1 视图原理1.2 创建视图 CREATE VIEW1.2.1 创建基于单表的视图1.2.2 创建基于多表的视图 1.3 查看视图1.3.1 查看视图的内容1.3.2 查看视图的详细信息 1.4 修改视图 ALTER VIEW1.4.1 修改视图内容1.4.2 修改视图名称 1.5 删除视图 DORP VIEW 【 2…

使用python下载股票数据至sqlite数据库

代码下载地址&#xff1a; https://download.csdn.net/download/weixin_44600457/89389489

PCIe总线-事物层之TLP路由介绍(七)

1.概述 下图是一个PCIe总线系统示意图。此时RC发出一个TLP&#xff0c;经过Switch访问EP&#xff0c;TLP的路径为红色箭头所示。首先TLP从RC的下行OUT端口发出&#xff0c;Switch的上行IN端口接收到该TLP后&#xff0c;根据其路由信息&#xff0c;将其转发到Switch的下行OUT端…