news 2025/12/23 8:12:00

嵌入式第三十七篇——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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/20 9:14:48

14、网络信息系统(NIS):原理、配置与应用详解

网络信息系统(NIS):原理、配置与应用详解 1. 引言 在局域网环境中,为用户提供透明的网络体验是一个重要目标。其中,确保关键数据(如用户账户信息)在所有主机间同步至关重要,这能让用户自由切换设备,无需记忆不同密码或复制数据。虽然域名系统(DNS)在互联网上用于特…

作者头像 李华
网站建设 2025/12/17 21:15:58

git迁移代码到其他仓库的方法 个人记录

克隆只包含指定分支的仓库 git clone --single-branch --branch <branch-name> <原仓库URL>如&#xff1a; git clone --single-branch --branch develop-重构1128 http://xxxllm_platform/test.gitcd <repo-directory>添加新的远程仓库 git remote add ne…

作者头像 李华
网站建设 2025/12/17 21:13:57

PPT排版又丑又慢怎么办?这个“AI生成PPT”功能,3秒拯救你的PPT

你是不是也遇到过这样的情况&#xff1a;明明内容都想好了&#xff0c;可一做PPT就头疼&#xff1f;调字体、对格式、找图片、排版面……折腾好几个小时&#xff0c;做出来的PPT还是不好看。更让人崩溃的是&#xff0c;有时候半夜还在改PPT格式&#xff0c;就为了第二天早上开会…

作者头像 李华
网站建设 2025/12/17 21:12:53

再次紧急修复,Flutter 针对 WebView 无法点击问题增加新的快速修复

前几天我们刚聊了 《Flutter 官方正式解决 WebView 在 iOS 26 上有点击问题》 &#xff0c;这是一个完整的底层重构修复&#xff0c;整个修复周期审核堪比“博士论文”&#xff0c;但是也带来了一个问题&#xff0c;它只修复了 Engine 和 Framework 层面问题&#xff0c;那插件…

作者头像 李华
网站建设 2025/12/17 21:12:15

给AI“考题”换个计分方式,谷歌SigLIP让多模态模型学得又快又好!

CLIP很强&#xff0c;但它也有“贵族病”&#xff1a;训练成本高得让人望而却步&#xff0c;动辄上千GPU天的算力让无数团队只能仰望。 直到SigLIP横空出世。 它用一个简单到近乎“暴力”的思想——Sigmoid Loss&#xff0c;把CLIP那套繁琐的InfoNCE损失彻底抛弃&#xff0c;…

作者头像 李华