当前位置: 首页 > news >正文

嵌入式第三十七篇——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)循环等待条件:若干线程 / 进程形成头尾相接的循环等待资源关系。

http://www.cnnetsun.cn/news/114137.html

相关文章:

  • HC32L130精准延时实现指南
  • 收藏必看!大学生网络安全学习5大方向,校招不踩坑,小白也能逆袭!
  • 收藏!从“黑客梦“到网络安全专家:过来人告诉你自学路线图
  • Bagisto 产品更新后,前台默认语言的内容不更信,其他语言正常。
  • 【收藏】运维转网安的黄金路径:4个高适配岗位+3步落地指南,薪资提升50%
  • 大语言模型全解析:一篇文章带你深入理解AI的强大能力!
  • 【网络】网络通信模型
  • Slimjet浏览器:基于Chromium的高效网页浏览解决方案,内置广告拦截与多功能工具
  • AMP页面还要做吗?2025替代方案及优化指南
  • 为什么你的RAG总是“一本正经地胡说八道”?EAG-RAG揭示真相,准确率暴涨300%的秘密!
  • iOS 项目中证书管理常见的协作问题
  • 理解线程不安全:从观察到原因分析
  • 《Java Web开发入门很简单》——学习笔记,新手入门,收藏这篇就够了
  • 2025年,国内外最火的10款降AI率工具亲测!(持续更新)
  • 基于大数据的餐饮食材管理系统的设计与实现开题报告
  • 基于大数据的交通信号智能控制系统的设计与实现开题报告
  • 基于大数据的交通信号智能控制系统的设计与实现任务书
  • 蜘蛛池站点优化思路分享
  • 2025 OA 选型关键看这 4 点:集成、灵活、安全、易用,附高性价比系统清单
  • 图神经网络与pytorch
  • Xiaomi 商城页面布局(部分)
  • FPGA以太网升级程序:便捷qspi Flash升级,具备校验功能,适用于Xilinx 7系列...
  • 运料小车装卸料控制:西门子1200PLC与TP700触摸屏联机仿真博途16
  • S32K311启动过程中,向量表重定向
  • 从蓝图到产线:高效产品信息传递的桥梁建设
  • 时间复杂度
  • 网站建设公司怎么选?2025年网站设计制作公司推荐指南
  • 今天咱们来聊一个挺有意思的优化算法改进——基于透镜成像反向策略的海洋捕食者算法。这个改进版本在原始MPA基础上搞了点新花样,咱们直接上干货看代码实现
  • Gitee:本土化DevOps平台如何重塑中国开发者生态
  • vCenter Server 8.0U3h 新增功能简介