Go 语言编程 — 并发 — 同步原语与锁

举报
云物互联 发表于 2021/08/06 01:39:26 2021/08/06
【摘要】 目录 文章目录 目录协程锁 协程锁 协程锁主要用于保证在执行 goroutine 的时候不阻塞 M。 举例:任务 A 需要修改 Z,任务 B 也需要修改 Z。如果是串行系统,A 执行完了,再执行B,很简单。在并发系统中,因为 A,B 是并发执行的,所以就需要在操作 Z 的时候确保 A、B 保证串行化的机制。 CO_LOCK { // 处理逻辑 }...

目录

文章目录

协程锁

协程锁主要用于保证在执行 goroutine 的时候不阻塞 M。

举例:任务 A 需要修改 Z,任务 B 也需要修改 Z。如果是串行系统,A 执行完了,再执行B,很简单。在并发系统中,因为 A,B 是并发执行的,所以就需要在操作 Z 的时候确保 A、B 保证串行化的机制。


CO_LOCK
{ // 处理逻辑
}
CO_UNLOCK

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  1. A 要修改 Z,所以 A 加了协程锁。
  2. 加锁之后,由于处理一些其他的逻辑,例如等待某些事件,又把 CPU 切到 M.g0 调度了(yield),并且此时没有放锁。
  3. 这时 M 把 B 拿过来执行,yield to B。
  4. B 也要修改 Z,但此时发现 A 已经对 Z 加锁了,于是 B 把自己挂到锁结构里面去。
  5. 然后 B 直接切走,yield to M.g0。
  6. 现在 A 的事件到达,M.g0 重新调度到 A 执行,yield to A。
  7. A 从刚刚切走的地方开始执行,完成后放锁。注意,A 方锁时,就会把 B 从锁队列中摘除,重新加到 M 的调度队列中。
  8. A 方锁后,M.g0 调度 B 执行。
  9. B 从刚刚加锁的地方唤醒,然后对 Z 加锁。然后走锁内逻辑后,放锁。

以上就是协程锁的实现原理。保证 A、B 在修改 Z 的时候必须串行化。

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/107449397

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。