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

Linux操作系统之线程:线程控制

前言上一篇文章我们着重对线程他的共享代码这个特点进行了论述讲解了部分性质与容易出现的问题。那么现在我们本篇文章就更加深层次的来学习一下线程吧一、上文补充我们说线程的绝大部分资源都是共享的这句话其实不是很完善。最准确的说法线程之间一切都是共享的。有人说不是还有独立的栈结构吗其实栈结构的独立性是编程语言或操作系统提供的逻辑保护而非物理隔离。他只是不想让你看见所以说如果你非要看见是有办法的代码语言javascriptAI代码解释#includeiostream #includepthread.h #includeunistd.h int *ptrnullptr; void* func1(void*_name) { std::string namestatic_castconst char*(_name); int a100;//临时变量在栈上面 ptra; while(true) { std::coutname线程运行: astd::endl; sleep(1); } } void* func2(void *_name) { std::string namestatic_castconst char*(_name); while(true) { if(ptr!nullptr)//防止func2先运行此时ptr还为空直接越界访问 std::coutname线程运行: (*ptr)std::endl; sleep(1); } } int main() { pthread_t tid1,tid2; pthread_create(tid1,nullptr,func1,(void*)pthread-1); pthread_create(tid2,nullptr,func2,(void*)pthread-2); pthread_join(tid1,nullptr); pthread_join(tid2,nullptr); return 0; }可以看见这个代码中我们在func一的线程中初始化了一个局部变量但是我们可以通过上节课讲的共享的特性用全局变量指针来让多个线程之间看到同一份资源。二、线程终止我们之前一开始就给大家讲解了线程的创建大家也就知道了在linux中严格意义上来说是没有线程的概念的只有轻量级进程。而我们的pthread_create函数内部其实是封装了cloneclone这个函数实际上是用来创建轻量级进程的。为了产生线程这个概念我们就在轻量级进程上面进行了一层封装这也就是pthread_create的由来。而pthread_create这个函数被各大语言封装成了各大语言Cjava线程接口但是由于底层是pthread_create所以我们在编译时都要链接上我们的pthread库。回顾完我们线程创建的知识现在我们来了解一下线程退出的几个方法我们手动给主副线程最后结束返回return可以知道主线程使用return会导致所有线程都退出也就是理论上的进程退出了。而副线程的return只会导致副线程退出。这就跟我们调用了一个函数return返回一样不会影响main函数那么exit呢这个函数我们在讲进程退出时说过这个函数会导致进程之间退出。那么大家就可以预料到了无论是在主线程还是副线程中调用exit都会导致所以线程立马退出也就相当于进程退出。正如同进程有专门的exit函数来退出线程也有专门的函数调用来退出线程pthread_exit函数的作用就是终止调用它的线程并可选地返回一个值线程的退出状态。代码语言javascriptAI代码解释void* func(void* arg) { printf(子线程正在运行\n); pthread_exit((void*)42); // 终止线程并返回值42 } int main() { pthread_t tid; void* retval; pthread_create(tid, NULL, func, NULL); pthread_join(tid, retval); // 获取子线程的退出值 printf(子线程返回: %ld\n, (long)retval); // 输出42 return 0; }值得一提的是在多线程编程中当线程通过pthread_exit或return返回一个指针时必须确保该指针指向的内存是全局变量或堆内存malloc分配而不能是线程栈上的局部变量。这是因为线程栈的生命周期与线程绑定线程退出后其栈内存会被回收导致返回的指针指向无效内存悬垂指针引发未定义行为如数据损坏或程序崩溃。除了这个函数来退出线程之外我们还可以取消线程pthread_cancel 是 POSIX 线程库中用于请求取消另一个线程的函数。它的作用类似于向目标线程发送一个“终止请求”但具体是否终止、何时终止以及如何清理资源取决于目标线程的取消状态和清理处理机制。这个函数通常是用我们的主线程调用来取消副线程取消的线程的返回值为-1。代码语言javascriptAI代码解释void*func(void* argv) { while(true) { std::cout子线程运行中 std::endl; sleep(1); } } int main() { pthread_t tid; pthread_create(tid, nullptr, func, nullptr); sleep(5); pthread_cancel(tid); void* retnullptr; pthread_join(tid, ret); std::cout子线程退出信息(long long int)retstd::endl; return 0; }这里我们要注意什么呢首先你要取消一个线程这个线程必须要先被启动了。并且被你取消的进程一定要用join回收否则会导致资源泄漏。所以我们就一定要谨慎调用这个函数。三、线程等待我们之前已经讲过线程等待函数pthread_join所以我们这里不再过多赘述我在这里补充一些内容。那如果我们的主线程要做自己事情呢我们之前说过线程等待会阻塞进程。有没有什么办法让主线程不阻塞呢有的我们可以切换线程等待的状态。一个线程有两种被等待的状态1、joined线程需要join默认状态2、detach线程分离主线程不必等待副线程我们可以调用pthread_detach函数使一个副线程的状态变为detach分离状态的作用是告诉操作系统当该线程结束时系统自动回收其资源无需其他线程调用 pthread_join来等待它 。线程结束后系统自动回收其资源其他线程无法再调用 pthread_join等待它调用会失败。但是这也会给我们带来一些问题如果我们的主线程先退出了副线程还没退出并且副线程此时是分离状态呢这会导致副线程直接退出大部分系统下所以我们一定要保证主线程比副线程后退出如果不能保证就不要分离线程。四、线程的exec问题我们想问一下当我们新建了一个线程之后还能进行exec吗此时exec会造成什么后果呢exec会 完全替换当前进程的地址空间包括所有线程无论是否分离而线程共享同一个进程地址空间所以其他线程的执行会被强制中断且 没有机会执行清理操作。所以我们不能使用exec的调用接口。那如果我们想使用exec函数该怎么办呢答案是fork没错就算是在副线程中我们也可以调用fork接口创造一个新进程随后就能在这个进程中使用exec的调用接口了。当我们在副线程中调用fork他只会复制当前线程。也就是说新创建的进程内只会有一个PCB。总结兄弟们线程这玩意儿就是个共享怪胎表面上说栈是独立的但实际上我用个全局指针就能偷看其他线程的栈数据创建线程底层就是个clone系统调用各大语言都是套了层皮而已。线程退出的姿势也可多主线程return直接带崩全场副线程return就跟函数返回一样乖巧。pthread_exit能优雅退场还能留个遗言但记住别返回局部变量的地址不然分分钟给你来个悬垂指针的惊喜pthread_cancel这货就是个线程杀手一枪崩了目标线程但记得一定要用join收尸不然资源泄漏有你受的。如果想不阻塞主线程detach一下就行但主线程要是先溜了子线程直接凉凉。所以要保证退出顺序哦~最坑爹的是exec这玩意儿一调用管你几个线程统统完蛋想用exec先fork个新进程再说。不过fork也是个坑货只复制当前线程其他线程的锁啊资源啊全都不管了死锁警告总之玩线程就是在刀尖上跳舞一个不小心就翻车

相关文章:

Linux操作系统之线程:线程控制

前言:上一篇文章我们着重对线程他的共享代码这个特点进行了论述,讲解了部分性质与容易出现的问题。那么现在我们本篇文章就更加深层次的来学习一下线程吧!一、上文补充我们说线程的绝大部分资源都是共享的,这句话其实不是很完善。…...

Pixel Dimension Fissioner应用案例:为独立游戏开发者生成100+任务描述

Pixel Dimension Fissioner应用案例:为独立游戏开发者生成100任务描述 1. 游戏开发者的创意困境 独立游戏开发者在创作RPG或冒险类游戏时,常常面临一个共同挑战:如何快速生成大量独特且风格一致的任务描述。传统方法要么依赖人工编写&#…...

如何用AI读脸术做实时分析?CPU推理优化实战案例详解

如何用AI读脸术做实时分析?CPU推理优化实战案例详解 1. 项目背景与核心价值 在当今的AI应用场景中,实时人脸属性分析正变得越来越重要。无论是社交平台的智能推荐、零售行业的顾客分析,还是安防监控的智能识别,快速准确的人脸属…...

STM32_ADC_寄存器操作

文章目录一、ADC寄存器   1、ADC状态寄存器(ADC_SR)   2、ADC控制寄存器 1(ADC_CR1)   3、ADC控制寄存器 2(ADC_CR2)   4、ADC采样时间寄存器 1(ADC_SMPR1)   5、ADC采样时间寄存器 2(ADC_SMPR2)   6、ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x1..4)   7、ADC看…...

STM32_ADC_模数转换器

文章目录一、ADC简介二、 逐次逼近型ADC三、STM32ADC框图四、 ADC基本结构图五、 输入通道六、规则组的4种转换模式   1、单次转换、非扫描模式   2、连续转换、非扫描模式   3、单次转换、扫描模式   4、连续转换、扫描模式   5、触发控制   6、数据对齐   7、转…...

将AI主权还给你:GPT4All开源生态,在个人电脑上私密运行千款大模型

GPT4All:重塑AI访问民主化的开源生态系统在云计算主导的AI时代,GPT4All以其“完全本地化”的理念,将大模型的掌控权从云端巨头手中交还给每一位普通用户,开启了隐私安全、成本可控的AI应用新范式。当OpenAI发布GPT-4却未公开其技术…...

5.4.3 通信->WWW万维网内容访问标准(W3C):WWW(World Wide Web) 协议架构(分层)

WWW 本身不是网络底层协议,而是基于 TCP/IP 协议栈构建的应用层分布式超文本系统,其协议架构采用清晰的分层模型,通常从底层网络 → 传输 → Web 应用自上而下分为四层,同时配套支撑体系形成完整架构 WWW 标准分层架构&#xff08…...

基于SpringBoot+Vue的健康医院门诊在线挂号系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着信息技术的快速发展,传统医疗行业的服务模式正逐步向数字化、智能化方向转型。医院门诊挂号作为医疗服务的重要环节,其效率直接影响患者的就医体验。传统线下挂号方式存在排队时间长、信息不对称、资源分配不均等问题,亟需通过信息化…...

SEO_掌握这七个SEO技巧,让你的流量持续增长

SEO技巧一:优化网站的关键词在当今互联网时代,网站的关键词优化是提升网站流量的重要手段之一。我们需要明确什么是关键词。关键词是用户在搜索引擎中输入的词语,用以查找相关信息的关键字。如果你的网站能够在这些关键词的搜索结果中排名靠前…...

SEO_10个提升网站排名的实用SEO技巧分享(470 )

SEO: 10个提升网站排名的实用技巧分享在当今数字化时代,搜索引擎优化(SEO)成为了每一个网站主人的首要任务。特别是对于想要在百度上获得高排名的网站而言,SEO技巧的掌握至关重要。本文将分享十个实用的SEO技巧,帮助你…...

# 发散创新:用Python打造自动化渗透测试工具链——从扫描到漏洞利用全流程实战在现代信息安全

发散创新:用Python打造自动化渗透测试工具链——从扫描到漏洞利用全流程实战 在现代信息安全攻防对抗中,快速、精准、可扩展的渗透测试能力已成为红队和安全研究人员的核心竞争力。本文将带你基于 Python 编写一个轻量级但功能完整的自动化渗透测试工具链…...

AudioLDM-S生成效果实测对比:10步和50步有什么区别?听音频就知道

AudioLDM-S生成效果实测对比:10步和50步有什么区别?听音频就知道 1. 一个参数,两种世界 如果你用过AI生成图片,一定知道“采样步数”这个参数。调高它,画面细节会更丰富,但生成时间也变长。在音频生成的世…...

SEO_如何通过内容优化有效提升SEO效果?(143 )

如何通过内容优化有效提升SEO效果?在当今互联网时代,搜索引擎优化(SEO)已经成为任何网站或博客成功的关键因素之一。SEO不仅仅是关于关键词排名,更是关于如何通过内容优化来提升SEO效果。如何通过内容优化有效提升SEO效…...

网络安全测评逻辑拓扑即学即会(二)

一、边框画法1.在“开始”栏“指针工具”右侧的形状中选择矩形。2.右键矩形框,依次选择“样式-填充-无填充”和“样式-线条-虚线”。3.移动鼠标在虚线框出现十字箭头时双击可以添加文字描述,通过“开始-段落”左侧半部分可以调整文字在虚线框里的位置。二…...

医学影像分割的‘注意力’该怎么加?从CVPR‘25论文MCADS,聊聊通道与空间注意力(CASAB)的实战设计心得

医学影像分割中的注意力机制实战:从MCADS论文看CASAB模块的设计哲学 当你在显微镜下观察一张病理切片时,那些看似杂乱的细胞排列其实隐藏着疾病诊断的关键线索。但要让AI模型像经验丰富的病理学家一样,准确识别出这些生物标志物的边界&#x…...

完整版:本地电脑 + WiFi 搭建 AI 自动炒股 + 自我学习系统

一、这套 AI 到底怎么 “学习赚钱”?(先讲逻辑,一看就懂) 核心逻辑:交易 → 记录 → 复盘 → 改错 → 优化策略 → 下次更赚钱 AI 的学习分为 4 层自动进化: 记住历史:每一笔买卖都记录&#…...

Shell脚本实战:5分钟搞定SFTP文件自动上传(含参数详解)

Shell脚本实战:5分钟搞定SFTP文件自动上传(含参数详解) 每次手动上传文件到远程服务器时,重复输入命令和密码的繁琐操作是否让您感到效率低下?本文将带您快速构建一个高可靠性的SFTP自动上传脚本,解决日常开…...

Qwen3-Reranker-4B在新闻推荐系统中的应用

Qwen3-Reranker-4B在新闻推荐系统中的应用 1. 新闻推荐的痛点:为什么传统方法不够用了 每天早上打开手机,你可能已经习惯了刷到一堆标题党新闻——“震惊!”“速看!”“最后一条”……这些内容看似热闹,但仔细一看&a…...

GitHub热门C语言开源项目:嵌入式与系统开发实用指南

GitHub 上热门 C 语言开源项目深度解析:嵌入式与系统级开发者的实用工具集在嵌入式系统、Linux 内核开发、物联网中间件及高性能服务构建等工程实践中,C 语言仍是最具确定性、可预测性与资源可控性的核心实现语言。尽管高级语言生态日益繁荣,…...

vue3基于springboot+nodejs的智慧社区活动商品管理系统的设计与实现

目录技术栈选择前端实现模块后端实现要点数据库设计部署方案测试策略关键风险应对项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 前端采用Vue3 TypeScript Element Plus/Pinia构建响应式单页应用,后端…...

2026大专电子商务就业压力大吗?

2026年大专电子商务专业就业压力分析电子商务行业近年来发展迅速,但随着市场竞争加剧,大专学历的电子商务专业毕业生可能面临一定的就业压力。以下是详细分析,包含行业趋势、就业方向、提升竞争力的方法等,并重点介绍CDA数据分析师…...

C语言高效哈希实践——uthash核心功能解析

1. 为什么需要uthash? 在C语言标准库中,并没有内置的哈希表实现。当我们需要处理键值对数据时,通常只能选择数组或链表这些基础数据结构。但在数据量较大时,它们的查找效率会直线下降——数组需要遍历,链表更是需要O(n…...

Vue3+springboot+nodejs的显卡之家 二手显卡商城交易系统 开题

目录技术栈选型与分工核心功能模块开发里程碑计划风险与应对项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选型与分工 Vue3:负责前端用户界面构建,采用Composition API提升代码复用性&#xff0…...

模型部署需要考虑的性能指标和模型部署的步骤

文章目录模型性能相关性能指标roofline model注意点模型部署相关量化量化里重要的细节量化映射粒度校准PTQQAT模型性能相关 性能指标 可以分为Memory bandwidth和compute bandwidth 模型里面优化目标是让计算峰值靠近compute bandwidth,让吞吐量靠近Memory bandw…...

Qwen-Image-Edit-F2P与SpringBoot集成:构建人脸生成图像的Web应用

Qwen-Image-Edit-F2P与SpringBoot集成:构建人脸生成图像的Web应用 1. 引言 想象一下这样的场景:你有一张普通的人脸照片,想要生成一张精美的全身照,可能是穿着礼服站在巴黎街头,或者是穿着古装站在古典长廊中。传统方…...

基于微信平台的“快一点”外送系统的设计与实现

目录 可选框架 可选语言 内容 可选框架 J2EE、MVC、vue3、spring、springmvc、mybatis、SSH、SpringBoot、SSM、django 可选语言 java、web、PHP、asp.net、javaweb、C#、python、 HTML5、jsp、ajax、vue3 内容 随着移动用户端的普及,微信因为其简单&#x…...

FastJson JSONPath 路径取值用法与场景总结

FastJson JSONPath 路径取值用法与场景总结 前言 在日常后端开发中,我们经常需要解析第三方接口返回的 JSON 数据。 传统方式需要一层层 getJSONObject()、getString(),代码繁琐、可读性差、维护成本高。 FastJson 提供的 JSONPath 可以通过路径表达式直…...

解决PyTorch 2.6兼容性问题:YOLOv8部署避坑指南

解决PyTorch 2.6兼容性问题:YOLOv8部署避坑指南 最近升级到PyTorch 2.6,准备部署YOLOv8模型时,是不是遇到了各种奇怪的报错?模型加载失败、推理速度变慢,甚至直接崩溃退出。这些问题看似复杂,其实大多源于…...

黑丝空姐-造相Z-Turbo实战体验:输入文字秒出图片,效果惊艳

黑丝空姐-造相Z-Turbo实战体验:输入文字秒出图片,效果惊艳 1. 初识黑丝空姐-造相Z-Turbo 1.1 什么是黑丝空姐-造相Z-Turbo 黑丝空姐-造相Z-Turbo是一款基于Xinference部署的文生图模型服务,它能够根据用户输入的文字描述,快速生…...

TIM+PWM输出+输入捕获测 频率+占空比(HAL库)

一:PWM输出(TIM2_CH1)HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);二:输入捕获测(TIM1 CH1CH2)三:开启CH1和CH2的中断四:初始化中断HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1…...