Thread线程学习(2) Linux线程的创建、终止和回收
目录
1.首先要了解什么是线程ID,以及它的作用是什么
2.创建线程
3.终止线程
4.回收线程
5.总结
在Linux系统中,线程是轻量级的执行单元,能够在同一个进程中并发执行。本文将介绍如何在Linux环境下创建、终止和回收线程,并提供相关的代码示例,以帮助读者更好地理解。
1.首先要了解什么是线程ID,以及它的作用是什么
线程ID(Thread ID)是用于唯一标识一个线程的值。它是在操作系统层面上分配和管理的,用于区分不同的线程。
线程ID的作用是多方面的:
-
线程标识:通过线程ID,我们可以区分不同的线程。每个线程都被分配一个唯一的线程ID,使得我们能够对特定的线程进行操作,如创建、终止、回收等。
-
线程控制:线程ID可以用于控制线程的执行。通过线程ID,我们可以向指定的线程发送信号、设置线程的优先级、挂起或恢复线程的执行等。
-
线程同步:在线程同步的场景中,线程ID常用于标识要进行同步操作的线程。例如,在使用互斥锁或条件变量等同步机制时,我们可以使用线程ID来指定要锁定或唤醒的特定线程。
-
线程管理:线程ID也可以用于线程的管理和跟踪。通过获取线程ID,我们可以监视和记录线程的执行状态、性能指标等,并进行相应的管理和优化。
总之,线程ID在多线程编程中具有重要的作用。它用于唯一标识不同的线程,并为线程的控制、同步、管理提供了便利。通过线程ID,我们可以对特定的线程进行操作和管理,从而实现并发编程的需求。示例代码如下:
#include <stdio.h>
#include <pthread.h>// 线程函数,打印线程的标识符
void* printThreadID(void* arg) {pthread_t tid = pthread_self(); // 获取当前线程的IDprintf("Thread ID: %lu\n", tid); // 打印线程IDpthread_exit(NULL); // 终止线程
}int main() {pthread_t threadID; // 定义线程ID变量int ret = pthread_create(&threadID, NULL, printThreadID, NULL); // 创建线程if (ret != 0) {printf("线程创建失败\n");return 1;}pthread_join(threadID, NULL); // 等待线程结束并回收资源return 0;
}
运行结果如下:
开始运行...Thread ID: 139912442345216运行结束。
2.创建线程
在Linux系统中,可以使用pthread_create
函数创建新线程。下面是一个简单的例子:
#include <stdio.h>
#include <pthread.h>// 线程函数,打印线程的标识符
void* printThreadID(void* arg) {pthread_t tid = pthread_self(); // 获取当前线程的IDprintf("Thread ID: %lu\n", tid); // 打印线程IDpthread_exit(NULL); // 终止线程
}int main() {pthread_t threadID;int ret = pthread_create(&threadID, NULL, printThreadID, NULL);if (ret != 0) {printf("线程创建失败\n");return 1;}pthread_join(threadID, NULL); // 等待线程结束return 0;
}
上述代码中,通过调用pthread_create
函数创建了一个新线程,将执行函数printThreadID
分配给新线程执行。pthread_create
函数的第一个参数是一个指向线程ID的指针,用于保存新创建线程的标识符。printThreadID
函数中使用pthread_self
函数获取当前线程的ID,并通过printf
函数打印线程ID。最后,调用pthread_exit
函数终止线程的执行。
3.终止线程
在线程中,可以通过调用pthread_exit
函数来显式地终止线程的执行。以下是一个简单的例子:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>// 线程函数,打印数字直到收到终止信号
void* printNumbers(void* arg) {int count = 0;while (1) {printf("%d ", count++);fflush(stdout);sleep(1);}pthread_exit(NULL); // 终止线程
}int main() {pthread_t threadID;int ret = pthread_create(&threadID, NULL, printNumbers, NULL);if (ret != 0) {printf("线程创建失败\n");return 1;}sleep(5); // 主线程等待5秒钟pthread_cancel(threadID); // 终止线程pthread_join(threadID, NULL); // 等待线程结束return 0;
}
运行结果如下:
始运行...0 1 2 3 4 运行结束。
上述代码中,我们创建了一个线程,通过循环打印数字。在主线程中,等待5秒钟后,调用pthread_cancel
函数向子线程发送终止信号,要求其退出执行。然后,使用pthread_join
函数等待线程结束。
4.回收线程
当线程结束执行后,需要对其进行回收,释放相关的资源。在Linux系统中,可以使用pthread_join
函数来回收线程。下面是一个示例:
#include <stdio.h>
#include <pthread.h>// 线程函数,打印线程的标识符
void* printThreadID(void* arg) {pthread_t tid = pthread_self(); // 获取当前线程的IDprintf("Thread ID: %lu\n", tid); // 打印线程IDpthread_exit(NULL); // 终止线程
}int main() {pthread_t threadID;int ret = pthread_create(&threadID, NULL, printThreadID, NULL);if (ret != 0) {printf("线程创建失败\n");return 1;}pthread_join(threadID, NULL); // 等待线程结束并回收资源return 0;
}
运行结果如下:
开始运行...Thread ID: 140267609319168运行结束。
在上述代码中,通过调用pthread_join
函数,主线程等待子线程的结束,并回收其资源。pthread_join
函数的第一个参数是待回收线程的标识符,第二个参数是指向线程返回值的指针(在此示例中,我们传入NULL
,表示不关心线程的返回值)。
5.总结
本文介绍了在Linux环境下创建、终止和回收线程的基本步骤。通过使用pthread_create()
函数创建线程,pthread_exit()
函数终止线程,并使用pthread_join()
函数回收线程资源,我们可以实现多线程并发编程。
在实际应用中,需要注意线程间的同步与互斥问题,以避免数据竞争和其他并发问题。同时,合理管理线程的创建和终止,确保线程资源的正确回收,是编写高效可靠的多线程程序的关键。
笔记分享,如有帮助随手一赞;
相关文章:

Thread线程学习(2) Linux线程的创建、终止和回收
目录 1.首先要了解什么是线程ID,以及它的作用是什么 2.创建线程 3.终止线程 4.回收线程 5.总结 在Linux系统中,线程是轻量级的执行单元,能够在同一个进程中并发执行。本文将介绍如何在Linux环境下创建、终止和回收线程,并提供…...

linux-项目部署软件安装
安装jdk 操作步骤: 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包,命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量,使用vim命令修改/etc/profile文…...

Vue3-黑马(三)
目录: (1)vue3-基础-计算属性 (2) vue3-基础-xhr-基本使用 (3)vue3-基础-xhr-promise改造 (1)vue3-基础-计算属性 上面有重复的代码,用计算属性࿰…...
标准C库函数fprintf(),sprintf(),snprintf()的函数使用方法(往文件中写入数据,将变量的值转换成字符串输出)
前言 如果,想要深入的学习标准C库中函数fprintf(),sprintf(),snprintf(),还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: man 3 fprintf/sprintf/snprintf即可查阅到完整的资料信息。 fprintf 函数 fprin…...

不到1分钟,帮你剪完旅行vlog,火山引擎全新 AI「神器」真的这么绝?
旅行时,想在社交平台发布一支精美的旅行 vlog,拍摄剪辑需要花费多长时间? 20 分钟?一小时?半天? 在火山引擎算法工程师眼里,可能 1 分钟都用不了,因为会有 AI 替你完成。 没错&#…...

MySQL的概念、编译安装,以及自动补全
一.数据库的基本概念 1、数据(Data) • 描述事物的符号记录 • 包括数字,文字,图形,图像,声音,档案记录等 • 以“记录”形式按统一的格式进行存储 2、表 • 将不同的记录组织在一起 • …...
Jmeter常见问题和工作中遇到的问题解决方法汇总
一、标题Jmeter常见问题解决 1.1 Jmeter如何针对https协议进行接口测试? 解决方法: 协议更改为:https,端口号更改为443;Jmeter默认的是:http协议,端口号是:80 1.2 Jmeter如何解决默…...

蓝牙单连接和多连接知识
蓝牙单连接和多连接知识 生活中蓝牙连接多路蓝牙的情况越来越多,下面介绍下单连接和多连接的知识,供大家参考 一:蓝牙单连接 蓝牙单连接也称为Point-to-Point 点对点连接,是最常见的蓝牙连接场景,如手机<–>车载蓝牙。&…...
Mongodb—查询数据报错 Sort operation used more than the maximum 33554432 bytes of RAM
线上服务的MongoDB中有一个很大的表数据有十几万条。然后报了下面这个错误: “exception”:”org.springframework.data.mongodb.UncategorizedMongoDbException”, “message”:”Query failed with error code 96 and error message ‘Executor error during find command:…...
Java内存异常和垃圾回收机制
内存溢出异常 Java会存在内存泄漏吗?请简单描述 内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说, Java是有GC垃圾回收机制 的,也就是说,不再被使用的对象,会被GC自动回收 掉,自动…...
linux系统挂载逻辑卷和扩展逻辑卷组
fdisk /dev/vdb fdisk /dev/vdc在分区后需要修改分区类型为 8e,操作过程类似: [rootlocal ~] $ fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command actiona tog…...

WPF:WPF原生布局说明
前言 WPF在国内讨论度很小,我在这里记录一下WPF简单的原生控件是如何使用的,顺便回忆一下WPF的基础知识,有些忘记的比较厉害了 WPF简介 WPF是微软推出的桌面UI软件,是我觉得最早实现MVVM(数据驱动事务)&…...

SpringMVC常用注解用法
Spring MVC是基于Servlet API构建的原始Web框架。 MVC是Model View Controller的缩写即视图模型控制器,是一种思想,而Spring MVC是对该思想的具体实现。关于SpringMVC的学习我们需要掌握用户和程序的连接、获取参数以及返回数据三大部分。而这三大功能的…...
Liunx find locate 命令详解
文章目录 find补充说明语法选项参数实例根据文件或者正则表达式进行匹配否定参数根据文件类型进行搜索基于目录深度搜索根据文件时间戳进行搜索根据文件大小进行匹配删除匹配文件根据文件权限/所有权进行匹配借助-exec选项与其他命令结合使用搜索但跳过指定的目录find其他技巧收…...

JAVA并发专题(1)之操作系统底层工作的整体认识
一、分诺依曼计算机模型 现代计算机模型是基于-冯诺依曼计算机模型,计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按…...

WiFi(Wireless Fidelity)基础(七)
目录 一、基本介绍(Introduction) 二、进化发展(Evolution) 三、PHY帧((PHY Frame ) 四、MAC帧(MAC Frame ) 五、协议(Protocol) 六、安全&#x…...

Agilent安捷伦33522B任意波形发生器
Agilent安捷伦33522B任意波形发生器30兆赫 2通道 为您最苛刻的测量生成全方位信号的无与伦比的能力 具有 5 倍低谐波失真的正弦波,可提供更纯净的信号 脉冲频率高达 30 MHz,抖动减少 10 倍,可实现更精确的计时 具有排序功能的逐点任意波形功能…...

PostgreSQL-如何创建并发索引
索引简介 索引是数据库中一种快速查询数据的方法。索引中记录了表中的一列或多列值与其物理位置之间的对应关系,就好比一本书前面的目录,通过目录中页码就能快速定位到我们需要查询的内容。 建立索引的好处是加快对表中记录的查找或排序,但…...

【大数据模型】使用Claude浅试一下
汝之观览,吾之幸也!本文主要聊聊Claude使用的流程,在最后对国内外做了一个简单问题的对比,希望国内的大数据模型更快的发展。 一、产品介绍 claude官网 Claude是一款由前OpenAI的研究员和工程师开发的新型聊天机器人,…...
鼎盛合——国产电量计芯片的分类与发展
电池技术在 200 余年的时间里不断演进,并在近 30 年的时间里取得了飞速发展,从最早期的铜-锌电池、铅酸电池,到目前的锂电池、钠电池,电池能量密度从早期的~10Wh/kg 飞速攀升至 200Wh/kg。回顾历史上来看,电池管理系统…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...