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

一个菜鸟程序猿的成长之路。116篇原创内容
公众号本文共1200字,预估阅读时3分钟
基础知识
什么是线程?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程有哪些状态?
在FreeRTOS 中的任务一共有四种状态分别是运行状态( Running State),就绪状态( Ready State),阻塞状态( Blocked State),挂起状态( Suspended State),其含义可以简单理解为:
-
运行状态: 正在执行的任务。
-
就绪状态:等待获得执行权的任务。
-
阻塞状态:直到某些条件达成才会重新进入就绪态等待获得执行权,否则不会执行的任务。
-
挂起状态:除非被主动恢复,否则永远不会执行。

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

在并发的时间里线程的执行是没有顺序的,但是软件的逻辑确实有顺序与先后之分。当线程1的输入条件是线程2的输出的话,按照合理的逻辑,线程1就必须在线程2执行后再运行,不然就可能发生程序bug。这时候我们就可以使用信号量,只要在线程2提供信号量时,线程1才能同步运行,这就是信号量的主要用途!—— 同步相关线程
互斥量
互斥量(Mutex):用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。

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

一个菜鸟程序猿的成长之路。116篇原创内容
公众号
完
拓展阅读:
历史精华文章集合:

氨气“ 携手进步 共同成长 ”
编程 · 目录
上一篇 下一篇
函数栈的原理 C语言中的 volatile 关键字