news 2026/6/22 5:39:05

嵌入式第三十七篇——linux系统编程——线程控制

作者头像

张小明

前端开发工程师

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

在多线程编程中,临界资源(全局变量、文件、设备等会被多线程读写的资源)的访问控制是核心问题,主要通过互斥同步机制解决,同时需规避死锁风险。

一、互斥

1. 概念

对临界资源的排他性访问,即同一时刻只能有一个线程对临界资源进行读写操作。

  • 问题根源:多线程并发执行时,指令可能被穿插调度(如A++对应的汇编指令分 3 步执行),导致数据一致性破坏。
  • 核心目标:保证临界区代码(访问临界资源的代码)的原子性。

2. 互斥锁的使用步骤

定义 → 初始化 → 加锁 → 解锁 → 销毁

3. 相关函数(POSIX 标准)

操作函数原型功能说明
定义pthread_mutex_t mutex;声明互斥锁变量
初始化int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);初始化互斥锁,attrNULL表示默认属性;成功返回 0,失败返回非零
加锁int pthread_mutex_lock(pthread_mutex_t *mutex);对临界区加锁,若锁已被占用则线程阻塞;加锁后代码为原子操作(一次调度必完成);成功返回 0,失败返回非零
解锁int pthread_mutex_unlock(pthread_mutex_t *mutex);释放互斥锁,解锁后其他线程可竞争锁;成功返回 0,失败返回非零
销毁int pthread_mutex_destroy(pthread_mutex_t *mutex);销毁已初始化的互斥锁;成功返回 0,失败返回非零

4. 注意事项

  • 加锁和解锁必须由同一个线程执行。
  • 临界区代码需短小精悍,避免休眠、大耗时操作(否则会降低多线程效率)。

二、同步

1. 概念

线程按照特定先后顺序对临界资源进行排他性访问,是互斥的特例(互斥包含同步)。

实现方式:常用信号量(计数信号量),可实现线程间的交叉释放(如线程 1 释放资源唤醒线程 2,线程 2 释放资源唤醒线程 1)。

2. 信号量的使用步骤

定义 → 初始化 → PV 操作 → 销毁

3. 相关函数

操作函数原型功能说明
定义sem_t sem;声明信号量变量
初始化int sem_init(sem_t *sem, int pshared, unsigned int value);初始化信号量:pshared=0为线程间使用,pshared≠0为进程间使用;value为信号量初始值(二值信号量常用 0/1,计数信号量可大于 1);成功返回 0,失败返回 - 1
P 操作(申请资源)int sem_wait(sem_t *sem);判断信号量是否有资源:有资源(value≥1)则value-1并继续执行,无资源(value=0)则线程阻塞;成功返回 0,失败返回 - 1
V 操作(释放资源)int sem_post(sem_t *sem);释放资源,value+1,线程不会阻塞;成功返回 0,失败返回 - 1
销毁int sem_destroy(sem_t *sem);销毁已初始化的信号量;成功返回 0,失败返回 - 1

4. 注意事项

  • 信号量允许临界区有短暂休眠或小耗时操作(相较于互斥锁更灵活)。
  • 二值信号量(value=0/1)用于单一资源的同步,计数信号量(value>1)用于多份资源的互斥访问。

三、死锁

1. 概念

因锁资源的申请 / 释放逻辑不合理,导致线程 / 进程无法正常执行的现象。

2. 产生死锁的四个必要条件(缺一不可)

(1)互斥条件:一个资源每次只能被一个线程 / 进程使用。

(2)请求与保持条件:线程 / 进程因请求资源阻塞时,对已获得的资源保持不放。

(3)不剥夺条件:线程 / 进程已获得的资源,在未使用完之前不能被强行剥夺。

(4)循环等待条件:若干线程 / 进程形成头尾相接的循环等待资源关系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 16:13:45

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

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

作者头像 李华
网站建设 2026/6/20 13:51:49

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

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

作者头像 李华
网站建设 2026/6/20 21:21:54

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

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

作者头像 李华
网站建设 2026/6/21 16:10:43

YOLOv8 模型预测

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

作者头像 李华
网站建设 2026/6/20 10:38:28

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

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

作者头像 李华
网站建设 2026/6/21 2:47:27

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

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

作者头像 李华