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

线程控制--1

一、进程与线程的1.1 引子进程是房子线程是房子里的人进程之间是独立的、解耦的不同房子线程属于同一个房子共享房子里的资源1.2 共享 vs 独占线程独占的数据不是绝对独占只是当前分配给你线程ID用户态标识——重要一组寄存器线程的上下文数据——最重要栈——最重要errno信号屏蔽字调度优先级线程共享的数据堆区、共享区文件描述符表每种信号的处理方式SIG_IGN、SIG_DFL或自定义handler当前工作目录用户ID和组ID核心理解线程的独占数据本质是执行流需要的私有上下文其他所有资源都是进程级的被所有线程共享。二、POSIX线程库pthread2.1 什么是pthread库与线程有关的函数构成一个完整系列绝大多数以pthread_开头使用时要引入头文件pthread.h链接时要加-lpthread选项gcc program.c -o program -lpthread2. 用户级线程的实质Linux 下的线程之所以叫用户级线程是因为我们用用户态的pthread.so来完成线程的管理工作内核只提供轻量级进程LWPpthread库在用户态对这些 LWP 进行封装和管理我们操作的是库提供的线程句柄不是内核直接暴露的 LWP三、线程创建pthread_createint pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);参数详解参数作用说明thread返回线程ID输出型参数不是 LWP而是库维护的地址对 LWP 的封装attr线程属性一般设 NULL用默认属性start_routine线程入口函数新线程要执行的函数回调函数arg传给入口函数的参数会传递给start_routine返回值成功返回 0失败返回错误码不是设置 errno理解线程IDpthread_t不是 LWP 号而是一个地址——指向pthread库内部维护的线程控制块TCB的指针。LWP 是内核看到的不需要暴露给用户。四、线程退出4.1 三种退出方式方式调用者特点return线程函数正常返回返回值是退出信息pthread_exit()线程内部主动终止自己可带退出信息pthread_cancel()其他线程取消指定线程线程异常退出时需要考虑退出信号之类的吗不用因为线程异常退出进程也就会异常 退出那我们也要拿到错误信号啊那就是进程的父进程的事情了与线程无关4.2 pthread_exit退出void pthread_exit(void *value_ptr);value_ptr线程的返回值退出信息注意需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是⽤malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。应指向全局变量或malloc分配的内存或者自己写一个字面值作为返回信息4.3 pthread_cancelint pthread_cancel(pthread_t thread);一个线程可以取消另一个线程thread就是你要取消的目标线程的适合主线程取消其他线程4.4 一个重要区别exit()终止整个进程任何线程调用都会导致所有线程退出pthread_exit()只终止当前线程五、线程等待pthread_joinint pthread_join(pthread_t thread, void **value_ptr);为什么需要等待主线程结束意味着进程结束所有线程会被强制终止如果不等待新线程可能没执行完就结束了类似进程的wait不等待会造成类似注意是类似僵尸的问题虽然查不到但存在调⽤该函数的线程将挂起等待,直到id为thread的线程终⽌。thread线程以不同的⽅法终⽌,通过pthread_join得到的终⽌状态是不同的总结如下:1. 如果thread线程通过return返回,value_ ptr所指向的单元⾥存放的是thread线程函数的返回值。 2. 如果thread线程被别的线程调⽤pthread_ cancel异常终掉,value_ ptr所指向的单元 ⾥存放的是常数PTHREAD_ CANCELED。 3. 如果thread线程是⾃⼰调⽤pthread_exit终⽌的,value_ptr所指向的单元存放的是传给 pthread_exit的参数。 4. 如果对thread线程的终⽌状态不感兴趣,可以传NULL给value_ ptr参数。参数thread要等待的线程IDvalue_ptr获取线程的返回值二级指针阻塞等待pthread_join是阻塞的等待成功后自动解决新线程的“僵尸”问题释放库内资源六、线程ID获取pthread_selfpthread_t pthread_self(void);线程调用获取自己的线程ID。可以配合pthread_joinpthread_self(void)来自我取消七、线程传参与返回值底层原理1 引子// 新线程 void* thread_routine(void* args) { return (void*)10; // 返回一个整数 } // 主线程 void *ret; pthread_join(tid, ret); printf(线程返回值: %ld\n, (long)ret); // 输出 102 返回值传递的底层机制关键问题新线程如何把自己的返回值交给主线程主线程如何通过pthread_join获得答案就在pthread库内部程序启动时会加载映射对应的库如pthread.so库内部维护线程控制块TCB——描述线程的结构体线程ID的本质pthread_t就是这个结构体在库中的虚拟地址线程退出时返回值被写入tcb-retvalpthread_join时传入线程ID即 TCB 地址从 TCB 中取出retval通过二级指针参数输出给调用者// pthread_join 简化逻辑 int pthread_join(pthread_t thread, void **value_ptr) { struct pthread_tcb *tcb (struct pthread_tcb*)thread; // 等待线程结束... if (value_ptr ! NULL) *value_ptr tcb-retval; // 把返回值传给用户 return 0; }3 为什么线程ID是地址内核不关心用户态的线程标识pthread库自己管理线程对象用地址作为 ID可以直接定位到 TCB高效访问八、堆空间与线程的“拥有”关系原则上堆区间也是共享的注意是原则上因为我们声明了一个全局变量但是只是在线程内部初始化他那么这个变量就是该线程所拥有的因为只有该线程知道这部分堆空间起始虚拟地址理解堆空间本身是进程共享的所有线程都能访问但如果你在线程内new或malloc了一块内存并把地址存在该线程私有的栈变量中其他线程不知道这个地址就无法访问所以从效果上看这块堆内存被这个线程“独占”了void* thread_routine(void* args) { int *data new int(10); // data 是栈上的局部变量存着堆地址 // 其他线程不知道 data 的值就无法访问这块堆内存 return nullptr; }这体现了共享是能力独占是使用方式。九、线程库的核心思想总结层面内容内核层轻量级进程LWP用task_struct模拟线程库层pthread.so封装 LWP提供线程管理接口用户层操作pthread_t句柄通过库函数管理线程线程ID是地址——指向库内 TCB通过它pthread_join能找到线程的控制块从中取出返回值释放线程资源这就是为什么说 Linux 线程是用户级线程——管理逻辑在用户态库中实现内核只提供轻量级进程作为底层支撑。

相关文章:

线程控制--1

一、进程与线程的1.1 引子进程是房子,线程是房子里的人进程之间是独立的、解耦的(不同房子)线程属于同一个房子,共享房子里的资源1.2 共享 vs 独占线程独占的数据(不是绝对独占,只是当前分配给你&#xff0…...

小程序图片加载优化方案

一、背景背景:小程序在加载的时候容易出现图片加载缓慢的问题项目图片使用现状分析1. 图片类型与来源类型来源处理方式静态资源图片baseImgUrl 相对路径服务器静态资源OSS图片后端返回的阿里云OSS地址已添加processOssImage自动转webp服务器图片BASE_FILEURL 文件…...

2026年七大闷声赚钱的AI技能

AI 技能差距:过去 20 年最大的财富风口在这个 AI 席卷全球的时代,我们正在目睹过去二十年来最大的财富分配机会。尽管 AI 的热度居高不下,但一个残酷的现实是:绝大多数人依然完全闲置着这项技术。他们或许听说过,却从未…...

基于电压电流双闭环和模糊PID双环的VIENNA整流器仿真研究

基于电压电流双闭环的vienna整流器的仿真(SVPWM调制) 基于模糊pid双环的vienna整流器仿真 适用于毕业,查重率10%以下 注:仿真页数34ppt随着可再生能源的广泛应用,高效、可靠的能量转换技术成为研究热点。VIENNA整流器作为一种先进…...

实习面经摘录(六)

来自网络,供个人学习,侵删 某滴 先完成再完美1.JVM内存结构也被定义为 运行时数据区,JVM内存结构分为两大类:线程私有区域/线程共享区域3.内存泄漏怎么处理排查常见内存泄漏场景静态集合类:不断add却从不remove。未关闭…...

导师推荐!AI论文写作软件 千笔写作工具 VS PaperRed,专为本科生量身打造!

随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为本科生完成毕业论文不可或缺的智能助手。越来越多的学生在面对繁重的写作任务时,开始依赖各类AI工具来提升效率、简化流程。然而,市场上AI写…...

实测对比后!倍受青睐的降AIGC软件 —— 千笔AI

在AI技术迅速渗透学术写作领域的当下,越来越多的本科生开始借助AI工具提升论文写作效率。然而,随着查重系统对AI生成内容的识别能力不断提升,如何有效降低AI率和重复率成为许多学生面临的难题。面对市场上五花八门的降AI工具,选择…...

MVI46-AFC串行通讯模块

MVI46-AFC串行通讯模块是一种用于工业自动化系统的数据处理与通信模块,通常安装在SLC系列PLC平台中。该模块主要用于流量计算与串行数据通信,可对来自现场仪表的流量、压力、温度等信号进行计算和处理,并通过串行接口实现与其他控制设备或监控…...

[算法][力扣3]无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。示例 2…...

《基于非对称纳什谈判的多微网电能共享运行优化策略》完美复现 仿真平台:MATLAB CPLEX...

《基于非对称纳什谈判的多微网电能共享运行优化策略》完美复现 仿真平台:MATLAB CPLEXMOSEK/IPOPT 主要做的是微网间基于非对称纳什谈判的P2P电能交易共享问题,基于纳什谈判理论建立了多微网电能共享合作运行模型,进而将其分解为微网联盟效益…...

Power BI技巧:度量值整理指南

在Power BI数据建模过程中,随着业务复杂度提升,度量值数量会不断增多。杂乱无章的度量值不仅会增加查找成本,还会影响团队协作效率。 今天就来分享一套度量值整理的最佳实践,帮你打造清晰、高效的模型结构。 度量值与列的核心区别…...

Canal同步完了,怎么验证数据对得上?

比起同步失败,较为棘手的是“看似成功”作为一名 DBA,深夜收到开发的消息:“Canal 同步任务跑完了,准备明天切业务,你帮看看数据对不对得上?”你熟练地登录数据库,准备手工核对几张核心表的数据…...

企微朋友圈自动化发布的技术实现

摘要企业微信朋友圈是企业触达客户的高效渠道,但官方仅支持手动发布,无法规模化运营。本文基于2026年度企微运营工具top3排行榜的技术视角,详解如何利用企微官方API和第三方iPad协议实现朋友圈的自动化创建、定时发布和效果追踪。提供两种技术…...

2026毕业论文AIGC降重权威评测,免费试用盘点!

摘要/前言: 欢迎来到2026年的毕业季。如果你还以为毕业论文的终极BOSS只是“查重率”,那么你可能已经输在了起跑线上。如今,高校的审查系统已经进化为“查重AIGC溯源”的多维审计模式。任何未经深度处理的AI生成内容,都如同在你的…...

2026小程序开发与运营指南:选对服务商,用对会员体系,轻松提升复购

2026小程序开发与运营指南:选对服务商,用对会员体系,轻松提升复购 在移动互联网深度渗透的今天,小程序已成为企业数字化转型的核心载体。2026年中国小程序服务市场规模突破900亿元,用户规模更是高达15亿,无…...

蔚来终于盈利,李斌能开香槟了吗

蔚来的用户和蔚来董事长李斌终于能松一口气了。成立11年,蔚来终于盈利了。3月10日蔚来公布了2025年第四季度及全年财务报告。报告显示,本季度蔚来共计交付12.5万辆车,同比增长超七成,经营利润(Non-GAAP)为1…...

蓝汛-897-添加6击按键事件

蓝汛-897-添加6击按键事件...

IP 溯源技术原理

IP 溯源技术原理 近期,一些网站(如 ip.sy、iptrack.nmqu.com)能够将外网 IP 地址精确到国内具体小区,引发广泛关注。本文从技术角度解析其实现原理,并通过实例数据展示定位精度,重点揭示外网 IP 如何被绑定…...

智慧党建:让线上线下融合,真正激活基层党组织活力

信息化背景下,党建迎来数字化转型关键。智慧党建系统以技术为抓手,打破传统党建时空壁垒与效率瓶颈,破解“管理难覆盖、学习难常态、考核难量化”痛点,为基层党组织注入新动能。智慧党建系统通过整合核心功能,构建“线…...

超简单!直接用封装好的二阶线性自抗扰控制模型

自抗扰控制模型,已封装好,可直接使用 二阶线性自抗扰家人们,今天来给大家分享一下已经封装好、可以直接使用的二阶线性自抗扰控制模型。在控制领域,自抗扰控制可是相当厉害的一种控制策略,它能有效处理系统中的不确定性…...

机房ip原生ip住宅ip性质区别

一、核心概念详解 1. 云服务器(Cloud Server) 不是 IP 类型,是基于云平台的虚拟服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)。本质:通过虚拟化技术,在物理服务器上划分出的独立虚拟主机&…...

亿迈跨境分销商城启航

当全球电商市场规模持续攀升,跨境卖家面临的却是一场关于资金周转与库存管理的双重考验。Statista研究显示,2025年全球电商市场规模预计达4.32万亿美元,面对这片广阔的蓝海,卖家们迫切需要一种既能快速启动、又能控制风险的出海模…...

2026中国停车场管理系统十大标杆供应商榜单——智赋停车,共筑城市出行新生态

随着新能源汽车的快速普及与城市智慧化建设的持续升级,停车场管理系统已彻底摆脱单一收费工具的定位,升级为“硬件平台服务”的综合生态体系。以下十大供应商凭借深厚的技术实力、多元的场景适配能力与良好的市场口碑,成为引领行业高质量发展…...

白色情人节,予你无尽的爱

源码&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>3.14白色情人节 只对你心动<…...

什么是公共DNS地址?

在日常网络使用中&#xff0c;你是否遇到过网页加载缓慢、域名解析失败的情况&#xff1f;这大概率和DNS设置有关。公共DNS地址作为第三方域名解析服务&#xff0c;能绕过运营商默认DNS&#xff0c;带来更稳定、快速的网络体验。很多人对公共DNS地址了解不深&#xff0c;不知道…...

计算机毕业设计源码:Python 携程旅游数据分析大屏系统 Django框架 selenium 爬虫 大数据 大模型 数据分析 agent 机器学习 旅行 出游 出行(建议收藏)✅

1、项目介绍 技术栈 Python作为主要开发语言&#xff0c;MySQL作为数据存储数据库&#xff0c;Django作为后端Web框架&#xff0c;selenium用于携程网旅游数据的爬取采集&#xff0c;HTML用于前端页面展示。 功能模块旅游景点信息采集模块注册登录模块系统数据概况模块…...

工业互联网IOT平台介绍(二):工业协议

工业协议&#xff08;也叫工业通信协议或工控协议&#xff09;是指专门为工业自动化和工业控制系统设计的通信规则和标准。它定义了PLC、传感器、变频器、伺服驱动器、HMI、上位机等各种工业设备之间如何可靠地交换数据&#xff0c;包括数据格式、传输时序、错误检测、主从/生产…...

springboot+vue二手物品交易boot代码--毕业论文

目录后端代码&#xff08;SpringBoot&#xff09;项目结构核心代码示例前端代码&#xff08;Vue&#xff09;项目结构核心代码示例数据库配置&#xff08;application.yml&#xff09;扩展功能建议项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获…...

心电域泛化研究从0入门系列 | 第三篇:数据集+多源域划分+标准评估——域泛化科研的“实验地基”

写在第三篇开篇&#xff1a;数据和实验规则&#xff0c;是域泛化的“立身之本”走完前两篇的基础认知和数据预处理&#xff0c;我们终于要触碰心电域泛化最核心的实操前提&#xff1a;用什么数据做研究、怎么把数据划分成“源域”和“目标域”、跑完模型后怎么证明它有泛化能力…...

DBeaver Ultimate Edtion 26.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具

DBeaver Ultimate Edtion 26.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具 One tool for all data sources 请访问原文链接&#xff1a;https://sysin.org/blog/dbeaver/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 通用…...