news 2026/4/23 6:49:23

嵌入式第三十六篇——linux系统编程——线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式第三十六篇——linux系统编程——线程

一、线程的核心概论与特征

1. 线程的基本定义

线程是轻量级的进程,隶属于某个进程,无法脱离进程独立存在。一个进程中默认包含一个主线程(对应程序入口main函数的执行流),用户可通过编程创建多个子线程,实现并发任务处理。

2. 线程的核心作用

与进程一致,线程的核心作用是实现程序的并发执行,尤其适用于处理相对耗时的任务(如 IO 操作、网络请求、大数据计算等),能够有效利用 CPU 资源,提升程序的整体执行效率。

3. 线程的关键特征

  • 进程是系统最小的资源分配单位:进程拥有独立的地址空间、文件描述符、内存资源等,系统以进程为单位分配资源。
  • 线程是系统最小的执行单位:线程本身不拥有独立的资源(除栈区外),而是共享所属进程的资源,CPU 以线程为单位调度执行。
  • 线程的平级关系:进程内的多个线程之间是平级关系,无父子之分,由系统统一调度。
  • 主线程的特殊性:进程启动时默认创建的主线程是程序的入口,若主线程退出,进程会随之终止,所有子线程也会被强制结束。

二、线程与进程的核心区别

线程与进程在资源管理、稳定性、开销等方面存在显著差异,具体对比如下:

对比维度进程线程
资源分配系统最小资源分配单位,拥有独立的 3GB 用户空间 + 1GB 内核空间共享所属进程的资源,仅独立拥有栈区(默认 8MB)、寄存器、程序计数器
资源独立性资源完全隔离,进程间默认无法共享进程内线程共享资源(代码段、数据段、堆、文件描述符等)
稳定性一个进程崩溃,不会影响其他进程一个线程崩溃会导致整个进程崩溃
创建开销大(需分配完整的地址空间)小(仅需开辟栈区)
并发度

三、POSIX 线程的编程步骤

Linux 下的线程编程遵循 POSIX 标准(pthread 库),核心编程步骤为:

plaintext

创建多线程 → 线程空间执行任务 → 线程资源回收(或设置分离属性自动回收)

其中,线程退出后默认不会释放栈区资源,需通过手动回收或分离属性设置完成资源释放,否则会造成内存泄漏。

四、线程相关的常用命令

在 Linux 中,可通过以下命令查看线程的相关信息:

1.ps -eLo pid,ppid,lwp,stat,comm:显示线程的进程 ID、父进程 ID、线程 ID、状态及命令名。

2.ps -eLf:以完整格式显示进程和线程的信息(包含线程 ID、优先级等)。

五、POSIX 线程核心函数详解

pthread 库提供了一系列函数用于线程的创建、控制与资源管理,以下是最常用的核心函数:

1. 线程创建:pthread_create

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  • 功能:创建一个新的线程,并指定线程的执行逻辑。
  • 参数
    • thread:输出参数,用于存储创建成功的线程 ID(需预先定义)。
    • attr:线程属性,通常设为NULL表示使用默认属性(如默认栈大小、非分离属性)。
    • start_routine:函数指针,指向线程的回调函数(线程的执行逻辑入口,即线程的工作空间)。
    • arg:传递给回调函数的参数(可传递任意类型数据,需通过指针转换)。
  • 返回值:成功返回 0,失败返回对应的错误码。

2. 获取当前线程 ID:pthread_self

pthread_t pthread_self(void);
  • 功能:获取当前线程的线程 ID。
  • 参数:无。
  • 返回值:成功返回当前线程的 ID(类型为pthread_t,通常可转换为unsigned long,格式化输出用%lu),失败返回非 0 值。

3. 线程主动退出:pthread_exit

void pthread_exit(void *retval);
  • 功能:让当前线程主动退出,且不会影响同进程的其他线程。
  • 参数retval:线程退出时的返回状态(即 “临死遗言”,可传递任意类型指针,需注意避免返回局部变量指针)。
  • 返回值:无。

4. 线程强制退出:pthread_cancel

int pthread_cancel(pthread_t thread);
  • 功能:向指定线程发送取消请求,请求结束该线程的执行。
  • 参数thread:需要被取消的线程 ID。
  • 返回值:成功返回 0,失败返回非 0 值。

5. 线程资源回收(阻塞方式):pthread_join

int pthread_join(pthread_t thread, void **retval);
  • 功能:回收指定线程的资源,该函数具有阻塞特性:若指定线程未结束,调用该函数的线程会阻塞等待,直到目标线程退出。
  • 参数
    • thread:需要回收的子线程 ID。
    • retval:输出参数,用于存储目标线程退出时的返回状态(对应pthread_exit的参数)。
  • 返回值:成功返回 0,失败返回非 0 值。

6. 设置线程分离属性:pthread_detach

int pthread_detach(pthread_t thread);
  • 功能:为指定线程设置分离属性,设置后,线程退出时其资源(栈区)会被系统自动回收,无需调用pthread_join
  • 注意:线程设置分离属性后,无法再通过pthread_join回收资源。
  • 参数thread:需要设置分离属性的线程 ID(可传入自身线程 IDpthread_self())。
  • 返回值:成功返回 0,失败返回非 0 值。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 6:47:41

收藏这篇!一文读懂大模型三大技术:RAG、Agent与多模态实战指南

大模型通过RAG、Agent与多模态三大技术重塑AI交互边界。RAG解决静态知识时效性,Agent赋予自主决策能力,多模态技术实现跨模态理解。三者协同攻克数据隐私、专业适配等难题,推动行业效率革新与业务重构。未来将向全模态能力、复杂系统构建和垂…

作者头像 李华
网站建设 2026/4/23 6:45:45

国内主要天气 API 数据来源分析与数据链条整理

一、国内主要天气 API 厂商的数据来源分析 服务商/API主要数据来源官方气象机构数据第三方数值预报/模式数据自有模型/融合处理备注高德地图天气 API多源整合(官方第三方)有可能接收 CMA 授权数据可能接入数值模式(如 GFS/ECMWF 等&#xff…

作者头像 李华
网站建设 2026/4/17 14:56:53

基于 RAII 的分布式通信资源管理:NCCL 库的 C++ 封装

在分布式深度学习系统的构建中,NVIDIA NCCL 是多卡通信的事实标准。然而,其原生 C API 要求开发者手动管理通信句柄的生命周期以及集合通信的分组调用。在复杂的异步推理流水线中,手动配对的 API 调用极易因逻辑分支或异常导致资源泄漏甚至死…

作者头像 李华
网站建设 2026/4/18 9:56:39

YOLOv8 模型预测

文章目录用.py文件运行yolo模型设置默认终端启动虚拟环境在.py文件中输入测试代码启动测试代码的指令得到测试结果测试代码二保存检测结果模型预测部分常见参数及使用方法介绍安装 jupyterlabjupyterlab 使用用.py文件运行yolo模型 内容对应关系: 两种方式实现的是同…

作者头像 李华
网站建设 2026/4/18 16:35:50

15、Linux 网络文件系统(NFS)使用指南

Linux 网络文件系统(NFS)使用指南 1. NFS 概述 网络文件系统(NFS)是使用远程过程调用(RPC)的最突出的网络服务之一。它允许用户以访问本地文件的相同方式访问远程主机上的文件。客户端通过内核支持和用户空间守护进程,结合服务器端的 NFS 服务器,实现了这种文件访问方…

作者头像 李华
网站建设 2026/4/18 8:20:33

18、Linux 电子邮件管理全解析

Linux 电子邮件管理全解析 1. 电子邮件基础概述 电子邮件自网络诞生以来就是网络的重要应用之一。最初,它只是简单地将文件从一台机器复制到另一台机器,并附加到收件人的邮箱文件中。随着网络的发展,复杂的路由需求和不断增加的邮件负载,使得更精细的方案成为必要。 网络…

作者头像 李华