同步互斥与通信学习笔记
概念
同步与互斥:我等你用完厕所,我再用厕所。
什么叫同步?就是:哎哎哎,我正在用厕所,你等会。
什么叫互斥?就是:哎哎哎,我正在用厕所,你不能进来。
同步与互斥经常放在一起讲,是因为它们之的关系很大,
“
互斥
”
操作可以使用
“
同步
”
来实现。我“
等
”
你用完厕所,我再用厕所。这不就是用
“
同步
”
来实现
“
互斥
”
吗?
再举一个例子
在团队活动里,同事
A
先写完报表,经理
B
才能拿去向领导汇报。
经理 B
必须等同事
A
完成报表,
AB
之间有依赖,
B
必须放慢脚步,被称为同步。
在团队活动中,同事 A
已经使用会议室了,经理
B
也想使用,即使经理
B
是领导,他也得等着,这就叫互斥。经理 B
跟同事
A
说:你用完会议室就提醒我。这就是使用
"
同步
"
来实现
"
互斥
"
。
各类方法的对比
能实现同步、互斥的内核方法有:信号量、互斥量、事件、邮箱、消息队列。
它们都有类似的操作方法:获取
/
释放、阻塞
/
唤醒、超时。比如:
- A 获取资源,用完后 A 释放资源
- A 获取不到资源则阻塞,B 释放资源并把 A 唤醒
- A 获取不到资源则阻塞,并定个闹钟;A 要么超时返回,要么在这段时间
- 内因为 B 释放资源而被唤醒。
这些内核对象五花八门,记不住怎么办?我也记不住,通过对比的方法来区分它们。
- 能否传信息?只能传递状态?
- 为众生?只为你?
- 我生产,你们消费?
- 我上锁,只能由我开锁
总结:
- 信号量:
- 核心是"计数值"
- 线程、ISR 释放信号量时,让计数值加 1
- 线程、ISR 获得信号量时,让计数值减 1
-
互斥量:
- 数值只有 0 或 1
- 谁获得互斥量,就必须由谁释放同一个互斥量
-
事件:
- 一个事件用一 bit 表示,1 表示事件发生了,0 表示事件没发生
- 可以用来表示事件、事件的组合发生了,不能传递数据
- 有广播效果:事件或事件的组合发生了,等待它的多个线程都会被唤醒
-
邮箱:
- 邮件为固定 4 字节,即指针大小
- 可以发给所有线程,也可以是指定线程
- 接收者可以是多个或 1 个
-
消息队列:
- 里面可以放任意数据,可以放多个数据
- 线程、ISR 都可以放入数据;线程、ISR 都可以从中读出数据