目录
协程锁
协程锁主要用于保证在执行 goroutine 的时候不阻塞 M。并发
举例:任务 A 须要修改 Z,任务 B 也须要修改 Z。若是是串行系统,A 执行完了,再执行B,很简单。在并发系统中,由于 A,B 是并发执行的,因此就须要在操做 Z 的时候确保 A、B 保证串行化的机制。spa
CO_LOCK { // 处理逻辑 } CO_UNLOCK
- A 要修改 Z,因此 A 加了协程锁。
- 加锁以后,因为处理一些其余的逻辑,例如等待某些事件,又把 CPU 切到 M.g0 调度了(yield),而且此时没有放锁。
- 这时 M 把 B 拿过来执行,yield to B。
- B 也要修改 Z,但此时发现 A 已经对 Z 加锁了,因而 B 把本身挂到锁结构里面去。
- 而后 B 直接切走,yield to M.g0。
- 如今 A 的事件到达,M.g0 从新调度到 A 执行,yield to A。
- A 从刚刚切走的地方开始执行,完成后放锁。注意,A 方锁时,就会把 B 从锁队列中摘除,从新加到 M 的调度队列中。
- A 方锁后,M.g0 调度 B 执行。
- B 从刚刚加锁的地方唤醒,而后对 Z 加锁。而后走锁内逻辑后,放锁。
以上就是协程锁的实现原理。保证 A、B 在修改 Z 的时候必须串行化。code