【Linux】:线程控制
朋友们、伙计们,我们又见面了,本期来给大家带来线程控制相关代码和知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux

目录
1. 创建线程
1.1 引入线程库
2. 获取线程id
3. 线程终止
4. 线程等待
5. 线程的分离
6. 线程的取消
1. 创建线程
在使用线程有关函数接口时需要引入头文件pthread.h
创建一个新的线程:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (*start_routine)(void*), void *arg);
参数:
- thread:返回新线程ID
- attr:设置线程的属性,attr为NULL表示使用默认属性
- start_routine:是个函数地址,线程启动后要执行的函数
- arg:传给线程启动函数的参数
返回值:
成功返回0,失败返回错误码。
代码演示:
#include <iostream> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #include <unistd.h>// 新线程 void *ThreadRoutine(void *arg) {const char *threadname = (const char *)arg;while (true){std::cout << "I am a new thread: " << threadname << ", pid: " << getpid() << std::endl;sleep(1);} }int main() {pthread_t tid;// 创建线程pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread 1");// 主线程while (true){std::cout << "I am main thread" << ", pid: " << getpid() << std::endl;sleep(1);}return 0; }1.1 引入线程库
当我们直接编译时可以发现报错,明明已经引入了线程相关的头文件,为什么还会找不到该函数呢?
因为Linux没有真正的线程,只有轻量级进程的概念,所以Linux OS只会提供轻量级进程创建的系统调用,不会直接提供线程的创建的接口,Linux的线程是通过pthread原生线程库实现的,所以我们需要在编译选项中引入线程库
Makefile:
testThread:testThread.ccg++ -o $@ $^ -std=c++11 -lpthread .PHONY:clean clean:rm -f testThread引入线程库之后再编译就不会出现报错了。
2. 获取线程id
获取自己的线程id:
pthread_t pthread_self(void);哪个线程调用该函数就可以返回哪个线程的id。
当我们将线程id获取并打印之后可以发现,线程id和线程的LWP毫无关系,并且线程id是一个比较大的数:
如果我们将这个id以十六进制的格式打印就会发现,线程的id本质上就是一个地址!
3. 线程终止
线程终止一共有三种方法:
- ① 直接在新线程中返回;
- ② 使用pthread_exit函数;
- ③ 使用pthread_cancel函数(线程的取消)。
线程终止可以直接在新线程中返回即可,还可以通过函数接口的方式进行终止:
void pthread_exit(void *retval);
注意:不能使用exit()来终止线程,这样会使整个进程退出。
参数:
- retval:可以设为空,也可以设置退出信息
4. 线程等待
线程和进程一样也是需要进行等待的,如果不等待就会发生和僵尸进程一样的情况(线程退出但是它的空间没有被释放),并且我们也会需要知道线程的退出信息,所以就需要有等待线程的接口。
int pthread_join(pthread_t thread, void **retval);
参数:
- thread:要等待的线程ID
- retval:它指向一个指针,后者指向线程的返回值(获取退出信息),也可以设为空
返回值:
成功返回0,失败返回错误码
代码演示:
获取返回值信息和线程终止接口配合使用
// 新线程 void *ThreadRoutine(void *arg) {int cnt = 1;const char *threadname = (const char *)arg;while (true){pthread_t id;// 获取线程idid = pthread_self();std::cout << "I am a new thread: " << threadname << " my id: " << ToHex(id) << std::endl;sleep(1);if(cnt == 5){// 线程退出,并带上退出信息pthread_exit((void *)"success");}cnt++;} }int main() {pthread_t tid;// 创建线程pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread 1");// 主线程// 等待新线程并获取退出信息void * message = nullptr;int n = pthread_join(tid, &message);std::cout << "Exit information for the new thread: " << (char *)message << ", " << n << std::endl;return 0; }
5. 线程的分离
- 我们创建的新线程默认是joinable的,线程退出之后是需要进行pthread_join()操作的,否则无法释放资源,当我们进行pthread_join()操作时,如果线程不退出,那么就会一直阻塞住,直到线程退出;
- 如果我们不关心线程的返回值,并且在等待线程时也是一种负担,所以这个时候就可以将线程设置为分离状态,即在线程退出的时候,自动释放线程的资源;
- 设置为分离状态的可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离;
- joinable和分离是冲突的,一个线程不能既是joinable又是分离的。
分离指定的线程:
int pthread_detach(pthread_t thread);
6. 线程的取消
取消一个执行中的线程:
int pthread_cancel(pthread_t thread);
线程如果被分离,是可以进行取消的,但是不能被等待!
朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!
相关文章:
【Linux】:线程控制
朋友们、伙计们,我们又见面了,本期来给大家带来线程控制相关代码和知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…...
大数据-174 Elasticsearch Query DSL - 全文检索 full-text query 匹配、短语、多字段 详细操作
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
Spring Boot视频网站:构建可扩展的视频服务平台
6系统测试 为了保证所开发出来的系统质量过关,让所开发出来的系统具备可靠性并能够投入运行使用,这就需要进行系统开发的最后一个关键步骤,那就是系统测试。可以说系统测试就是对系统开发前面的步骤,比如系统分析与设计等进行复查…...
护眼台灯横评:书客、柏曼、明基哪款使用体验好,又能护眼?
如果你使用过护眼台灯,就太能理解为什么护眼台灯会诞生了。护眼台灯确实有一定的护眼作用,光线柔和不刺眼,许多护眼台灯还有智能调光、定时休息等人性化功能。在当今这个数字化时代,长时间面对电脑屏幕或埋头于书本已成为许多人的…...
RDMA笔记
目录 1. RDMA简介1.1. 比较Socket与RDMA的通信1.2. RDMA优势1.3. RDMA 2. RDMA基本元素2.1. QPSQ, SQE & RQ, RQEQPNQPC 2.2. CQ2.3. MR2.4. PD 3. RDMA基本操作3.1. Send & Receive3.2. RDMA Write3.3. RDMA Read 阅读RDMA相关资料,从硬件开发角度对RDMA作…...
Collection 单列集合 List Set
集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…...
LabVIEW提高开发效率技巧----跨平台开发
在如今的多平台环境下,开发者常常面临不同操作系统的需求,如Windows、Linux和RT(实时)系统等。而LabVIEW作为一种强大的开发工具,提供了支持跨平台开发的能力,但要使其无缝迁移,开发者需要掌握一…...
创建uniCloud新项目并且是新服务空间,运行会报Error: Invalid uni-id config file错误
问题说明 新创建的服务空间,新起的项目,运行查询数据库就会报错,Uncaught (in promise) Error: Invalid uni-id config file,我记得在原来创建项目的时候,是不需要进行配置的,最近创建新项目出现了这个错误…...
七、IPD 方法论框架(IPD的组织架构)
IPD的组织架构 在IPD(集成产品开发)方法论中,组织架构是确保跨职能团队高效协作、快速响应市场需求的关键要素之一。IPD的组织架构通常打破传统的职能部门隔离,倡导跨职能团队和矩阵式管理模式,使各职能部门在项目开发中紧密合作,从而提高开发效率,降低沟通成本。 IPD…...
iPad mini 7惨遭暗砍一刀
大屏是工作,小屏才是生活。 iPad mini系列,一直被誉为最适合普罗大众的平板。热爱学习、工作的卷王不多,沉迷游戏、追剧的俗人不少。 对娱乐场景而言,便携性是核心属性。iPad mini不大不小,只有两台手机的大小&#x…...
【计算机网络 - 基础问题】每日 3 题(三十六)
✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…...
Docker镜像
Docker是一个开源的容器化平台,它可以帮助开发人员打包应用程序及其依赖项为轻量级、可移植的容器,以实现快速部署和可扩展性。下面是关于Docker的一些基本概念和优势: 容器:Docker使用容器来封装应用程序和其所有依赖项ÿ…...
Golang | Leetcode Golang题解之第478题在圆内随机生成点
题目: 题解: type Solution struct {radius, xCenter, yCenter float64 }func Constructor(radius, xCenter, yCenter float64) Solution {return Solution{radius, xCenter, yCenter} }func (s *Solution) RandPoint() []float64 {r : math.Sqrt(rand.…...
菜鸟笔记006 截图识别文字插件 textOCR
随手可得的截图识别文字插件 textOCR,识别出来的文字可直接输入到illustrator的当前文档中: 执行条件 1、需截图软件支持,推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…...
MySQL【知识改变命运】07
MySQL 1:Group by 分组查询1.1:语法:1.2:练习 2:having⼦句3回顾:3:内置函数3.1 :⽇期函数 1:Group by 分组查询 可以根据某列,进行分组查询,比如学校里面的…...
Matlab自学笔记三十八:日期时间序列的创建方法
1.概念 时间序列是指,某一时间段的时间,也就是说,一组日期时间数据组成的序列,例如,1.1~1.10,1点~5点等,在Matlab中,使用向量表示这种时间序列,例如[2025.1.1 2025.1.2 …...
fiber的原理
React Fiber 的主要原理包括动态优先级、可中断的工作、增量渲染和协作式多任务 React Fiber 是 React 16 引入的一种新的协调(reconciliation)引擎,它旨在提高 React 应用的性能和响应性。Fiber 的核心原理主要包括以下几个方面:…...
重塑输电线路运维管理,巡检管理系统守护电网稳定运行
在输电线路巡检管理中,一个高效、直接的巡检系统对于确保电力供应的稳定性和安全性至关重要。巡检系统能够直接对接运维需求,减少繁琐流程,并强化数据分析能力,这无疑为输电线路的运维管理带来了诸多优势。以下是对这些优势的具体…...
各种排序方法总结
目录 1. 冒泡排序 (Bubble Sort 2. 选择排序 (Selection Sort) 3. 插入排序 (Insertion Sort) 4. 快速排序 (Quick Sort) 5. 归并排序 (Merge Sort) 6. 堆排序 (Heap Sort) 排序算法 时间复杂度 空间复杂度 备注冒泡排序 最好情况: O(n) 平均情况: O(n^2) 最坏情况: O(n^…...
【工欲善其事】巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号
文章目录 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号1 问题描述2 解决方案3 具体步骤4 效果测试5 小结与复盘 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号 1 问题描述 不知各位是否也为复制过来的文本中夹杂的回车换行符抓狂过?就是在复…...
FFmpeg5.0源码解析——深入探索MOV文件格式的封装与解封装机制
1. MOV文件格式的前世今生 第一次接触MOV格式还是在十年前处理iPhone拍摄的视频时,这种由苹果公司开发的容器格式就像个精致的黑盒子,表面看着简单,打开后才发现内部结构精妙绝伦。和MP4这对"孪生兄弟"都基于ISO基础媒体文件格式(I…...
3分钟搞定Windows启动盘制作:WinDiskWriter让macOS用户告别复杂命令行
3分钟搞定Windows启动盘制作:WinDiskWriter让macOS用户告别复杂命令行 【免费下载链接】windiskwriter 🖥 A macOS app that creates bootable USB drives for Windows. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. …...
Jessibuca播放器在低代码平台中的集成实践:5分钟为你的应用添加实时视频能力
Jessibuca播放器在低代码平台中的集成实践:5分钟为你的应用添加实时视频能力 当企业需要快速构建内部管理系统或行业解决方案时,低代码平台正成为提升开发效率的利器。而视频能力作为现代应用的基础需求,如何在不编写复杂代码的情况下实现专业…...
R语言实战:用sf和ggplot2绘制带比例尺和指北针的专业地图(附完整代码)
R语言地理信息可视化实战:从数据到专业地图的完整指南 地理信息数据可视化是科研和商业分析中不可或缺的一环。无论是环境监测、城市规划还是流行病学研究,将空间数据转化为直观的地图都能极大提升数据洞察力。本文将手把手教你使用R语言中的sf和ggplot2…...
避坑指南:在Ubuntu 20.04上搞定XTDrone+ORB-SLAM2,我踩过的那些依赖版本坑
避坑指南:在Ubuntu 20.04上搞定XTDroneORB-SLAM2,我踩过的那些依赖版本坑 当你在Ubuntu 20.04上尝试搭建XTDrone与ORB-SLAM2的开发环境时,可能会遇到各种令人抓狂的依赖版本冲突问题。作为一个经历过无数次失败后终于成功配置的开发老手&…...
Visual C++运行库AIO解决方案:技术赋能Windows应用程序兼容性管理
Visual C运行库AIO解决方案:技术赋能Windows应用程序兼容性管理 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 在Windows生态系统中,Vis…...
用Logisim从零搭建一个24小时数字时钟:从计数器到完整计时器的保姆级教程
用Logisim从零搭建一个24小时数字时钟:从计数器到完整计时器的保姆级教程 数字时钟是现代生活中不可或缺的设备,但你是否曾好奇过它的内部工作原理?在数字电路的世界里,构建一个24小时计时器不仅是一项有趣的实践,更是…...
v-md-editor进阶技巧:如何在Vue2中实现markdown与HTML的双向转换
Vue2项目中v-md-editor深度应用:Markdown与HTML双向转换实战指南 在内容管理系统、技术文档平台或博客应用中,Markdown与HTML格式的相互转换是开发者常遇到的核心需求。v-md-editor作为Vue生态中功能强大的Markdown编辑器,其双向转换能力往往…...
AOP_青春版_VS_Pro版
背景:在javaweb和ssm中学习了面向切面编程的两种方式(两种切点表达式不同),在苍穹外卖中,对于设置更新时间,创建时间,更新人,创建者为避免重复编码,将Update&Insert中…...
2026知识付费平台选择指南:学习者与创作者如何各取所需
2026年,知识付费行业已进入成熟期。据艾媒咨询(iiMedia Research)预测,2026 年中国知识付费市场规模将突破3000 亿元,较 2025 年的 2808.8 亿元持续增长。然而,平台分化加剧——有的平台陷入内容同质化困境…...








