互斥量(Mutex)
本文档根据《嘉楠K230开发手册》V1.0(2024-11-30)整理。正文、表格、示例代码与插图均来自原始手册。
怎么独享厕所?自己开门上锁,完事了自己开锁。
你当然可以进去后,让别人帮你把门:但是,命运就掌握在别人手上了。
使用队列、信号量,都可以实现互斥访问,以信号量为例:
- 信号量初始值为1
- 任务A想上厕所,"take"信号量成功,它进入厕所
- 任务B也想上厕所,"take"信号量不成功,等待
- 任务A用完厕所,"give"信号量;轮到任务B使用
这需要有2个前提:
- 任务B很老实,不撬门(一开始不"give"信号量)
- 没有坏人:别的任务不会"give"信号量
可以看到,使用信号量确实也可以实现互斥访问,但是不完美。
使用互斥量可以解决这个问题,互斥量的名字取得很好:
- 量:值为0、1
- 互斥:用来实现互斥访问
它的核心在于:谁上锁,就只能由谁开锁。
本章涉及如下内容:
- 为什么要实现互斥操作
- 怎 么使用互斥量
- 互斥量导致的优先级反转、优先级继承
互斥量的使用场合
在多线程系统中,线程A正在使用某个资源,还没用完的情况下线程B也来使用的话,就可能导致问题。
比如对于串口,线程A正使用它来打印,在打印过程中线程B也来打印,客户看到的结果就是A、B的信息混杂在一起。
这种现象很常见:
- 访问外设:刚举的串口例子
- 读、修改、写操作导致的问题
