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。回顾历史上来看,电池管理系统…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
