当前位置: 首页 > news >正文

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的底层实现。

相关文章:

Linux线程:线程分离

目录 一、什么是线程分离 1.1pthread_detach 1.2pthread线程库存在的意义 1.3__thread线程的局部存储 1.4系统调用clone 一、什么是线程分离 1.1pthread_detach 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_joi…...

chatgpt之api的调用问题

1.调用api过程中,出现如下报错内容 先写一个测试样例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根据自己所在地区和key情况进行completion openai.ChatCompletion.create(model"g…...

Java中lambda表达式是啥怎么使用

在Java中,Lambda表达式(也称为闭包)是一种简洁地表示匿名函数(即没有名称的函数)的方式。它们允许你将函数作为参数传递或赋值给变量,从而简化代码。Lambda表达式在Java 8及更高版本中引入。 Lambda表达式…...

selenium中, quit 和close的区别

close时 """ close和quit的区别 close关闭当前页 (只是关闭了当前) quit离开整个浏览器 (走远了) """ from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.co…...

管易云和金蝶云星空接口打通对接实战

管易云和金蝶云星空接口打通对接实战 源系统:管易云 金蝶管易云是金蝶集团旗下以电商和新零售为核心业务的子公司,公司于2008年成立,拥有从事电商及新零售业务相关专业知识工作者超过1000人。为伊利、网易有道、东阿阿胶、金龙鱼、海康、科大讯飞等超过1…...

DP-Kmaens密度峰值聚类算法

我有个问题 关于 [密度值>密度阈值] 的判定这里,新进来的新数据怎么确定他的密度值?密度阈值又是怎样确定的呢?...

STM32-14-FSMC_LCD

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU 文章目录 1. 显示器分类2. LCD简…...

linux nohup命令详解:持久运行命令,无视终端退出

nohup (全称为 “no hang up”),用于运行一个命令,使其在你退出 shell 或终端会话后继续运行。 基本语法 nohup command [arg1 ...] [&> output_file] &command 是你想要运行的命令。[arg1 ...] 是该命令的参数。&am…...

PS系统教程09

修复照片 修饰工具 污点修复画笔工具(J) 主要作用:去除一些污点或者不需要的 【:缩小】:放大 目标:去掉这两个点 修复画笔工具 也就是说我们要有取样点 选择修复画笔工具按住Alt键吸取周边相近颜色松开单机…...

2024089期传足14场胜负前瞻

2024089期售止时间为6月3日(周一)22点00分,敬请留意: 本期1.5以下赔率5场,1.5-2.0赔率5场,其他场次是平半盘、平盘。本期14场难度偏低。以下为基础盘前瞻,大家可根据自身判断,复选增…...

备战十一届大唐杯国赛预选赛

这次省赛带了太多个省一了,具体可看下面的图片,只放了一部分。目前根据可靠消息,应该还有个预选赛和去年一样,就是还会考一次仿真。如果说通过了就是国二起步然后去北方工业争夺国一国二,没过的话就是国三。 每…...

安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决

记录更新Android Studio版本及适配Android V应用配置的一些过程问题。 安装包:android-studio-2024.1.1.6-windows.exe原版本:Android Studio23.2.1.23 Koala 安装过程 Uninstall old version 不会删除原本配置(左下角提示) Un…...

美团一面:什么是CAS?有什么优缺点?我说你说的是AtomicInteger吗?

引言 传统的并发控制手段,如使用synchronized关键字或者ReentrantLock等互斥锁机制,虽然能够有效防止资源的竞争冲突,但也可能带来额外的性能开销,如上下文切换、锁竞争导致的线程阻塞等。而此时就出现了一种乐观锁的策略&#x…...

【linux】(2)文件内容排序sort

sort 是一个用于排序文件内容的命令行工具,在 Linux 和 Unix 系统中非常常用。 基本用法 sort [OPTION]... [FILE]...常用选项 按数值排序 -n sort -n filename例子:对包含数值的文件进行排序。 按字典顺序排序 -d sort -d filename例子&#xff1…...

css 图片上添加模糊背景的文字内容

html部分 <div class"onlogo"> <img src"../assets/img/banner.png" /><div class"imgText"><div class"title">一体化电子印章应用服务</div><div class"content">为企业提供安全可靠…...

Python3 函数参数

前言 本文主要介绍python中的函数参数&#xff0c;主要内容包括形式参数与实际参数的概念、位置参数、关键字参数、默认参数、可变参数。 文章目录 前言一、形式参数与实际参数的概念二、位置参数&#xff08;也叫必需参数&#xff09;三、关键字参数四、默认参数五、可变参数…...

精准检测,可燃气体报警系统的技术原理与特点

在现代化的工业生产与日常生活中&#xff0c;可燃气体泄露事故频发&#xff0c;给人们的生命和财产安全带来了严重威胁。 因此&#xff0c;可燃气体报警检测系统的应用变得尤为重要。它不仅能够实时监测环境中的可燃气体浓度&#xff0c;还能在发现异常情况时及时报警&#xf…...

6月2(信息差)

&#x1f30d;特斯拉&#xff1a;Model3高性能版预计6月中旬开启首批交付 &#x1f384;微软对开源字体 Cascadia Code 进行重大更新 ✨天猫618加码引爆消费热潮 截至晚9点185个品牌成交破亿 1.瑞士清洁科技公司Librec开发废旧锂离子电池回收技术&#xff0c;可回收电池90%的…...

先锋文汇发稿技巧方法

v&#xff1a;yangwei013049 看到标题&#xff0c;有的同志也许会说&#xff0c;投稿就是把稿子发走就行了呗&#xff0c;这要讲究什么方法呢&#xff1f;其实&#xff0c;投稿里面也有学问。不会投稿&#xff0c;方法不当&#xff0c;往往得不到好的效果。 从我多年的实践和…...

无人机推流/RTMP视频推拉流EasyDSS无法卸载软件是什么原因?

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...