RTOS 中的信号量和互斥量

之前在学习 UCOS ii 的时候就对这两个知识点(信号量,互斥量)不太理解,导致我后来写并发小线程的时候只会使用锁(lock)。虽然对于平常的小开发来说,偶尔使用锁资源确实无伤大雅,但如果要运用到实时嵌入式系统中的话,那可就不行了。原因是实时嵌入式系统中充斥着大量的全局变量,动不动就上锁,真是太奢侈了。最近在看 Free RTOS 的时候,又重新关注到了这两个知识点,刚好和大家一起分享一下。首先把结论告诉到家:互斥量用于共享资源的保护,信号量用于线程的同步。

汽车ECU设计

RTOS 中的信号量和互斥量:原文配图 1

一个菜鸟程序猿的成长之路。116篇原创内容

公众号本文共1200字,预估阅读时3分钟

基础知识

什么是线程?

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程有哪些状态?

在FreeRTOS 中的任务一共有四种状态分别是运行状态( Running State),就绪状态( Ready State),阻塞状态( Blocked State),挂起状态( Suspended State),其含义可以简单理解为:

  1. 运行状态: 正在执行的任务。

  2. 就绪状态:等待获得执行权的任务。

  3. 阻塞状态:直到某些条件达成才会重新进入就绪态等待获得执行权,否则不会执行的任务。

  4. 挂起状态:除非被主动恢复,否则永远不会执行。

RTOS 中的信号量和互斥量:原文配图 2

信号量

信号量(semaphore):用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。

RTOS 中的信号量和互斥量:原文配图 3

在并发的时间里线程的执行是没有顺序的,但是软件的逻辑确实有顺序与先后之分。当线程1的输入条件是线程2的输出的话,按照合理的逻辑,线程1就必须在线程2执行后再运行,不然就可能发生程序bug。这时候我们就可以使用信号量,只要在线程2提供信号量时,线程1才能同步运行,这就是信号量的主要用途!—— 同步相关线程

互斥量

互斥量(Mutex):用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。

RTOS 中的信号量和互斥量:原文配图 4

多线程操作时,不可避免的要访问共享资源,比如 printf 等 IO 输出资源。试想一下,如果所有的线程都在满屏的打印字符,那会是一个什么感觉?所以当有且只有一个资源的情况下,我们使用互斥量来保护资源(共享资源,硬件资源等)。只有当线程释放资源后,其他线程才能访问。这就是互斥量的主要用途!—— 保护共享资源最后再强调一下,互斥量用于共享资源的保护,信号量用于线程的同步。虽然你也可以使用二元信号量来保护共享资源,但是我不建议你这么做。虽然两者很相似,但还是有所区别。互斥量用完后必须归还!用于同步的信号量通常完成同步后便丢弃,不再归还。

汽车ECU设计

RTOS 中的信号量和互斥量:原文配图 6

一个菜鸟程序猿的成长之路。116篇原创内容

公众号

完

拓展阅读:

早在盘古开天之前 (Main的故事)

C语言 Memory Layout

历史精华文章集合:

【汽车ECU设计】汽车总线文章合集

【汽车ECU设计】Autosar文章合集

【汽车ECU设计】工作思考合集

【汽车ECU设计】第51~100期目录

【汽车ECU设计】第1~50期目录

RTOS 中的信号量和互斥量:原文配图 5

氨气“ 携手进步 共同成长 ”

编程 · 目录

上一篇 下一篇

函数栈的原理 C语言中的 volatile 关键字

← 返回文章列表