请选择 进入手机版 | 继续访问电脑版

[Golang] 详解Golang并发操作中常见的死锁环境

[复制链接]
查看98 | 回复14 | 2021-9-15 02:34:14 | 显示全部楼层 |阅读模式
目次

什么是死锁,在Go的协程内里 死锁通常就是永世 壅闭 了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你。我俩都这么想,这事就办理 不了了。

第一种环境 :无缓存本领 的管道,本身 写完本身 读

先上代码:

  1. func main() {
  2. ch := make(chan int, 0)
  3. ch <- 666
  4. x := <- ch
  5. fmt.Println(x)
  6. }
复制代码

我们可以看到这是一个没有缓存本领 的管道,然后往内里 写666,然后就去管道内里 读。如许 肯定会出现题目 啊!一个无缓存本领 的管道,没有人读,你也写不了,没有人写,你也读不了,这正是一种死锁!

  1. fatal error: all goroutines are asleep - deadlock!
复制代码

办理 办法很简单,开辟 两条协程,一条协程写,一条协程读。

第二种环境 :协程来晚了

  1. func main() {
  2. ch := make(chan int,0)
  3. ch <- 666
  4. go func() {
  5. <- ch
  6. }()
  7. }
复制代码

我们可以看到,这条协程开辟 在将数字写入到管道之后,由于 没有人读,管道就不能写,然后写入管道的操作就不停 壅闭 。这时间 你就有迷惑 了,不是开辟 了一条协程在读吗?但是那条协程开辟 在写入管道之后,假如 不能写入管道,就开辟 不了协程。

第三种环境 :管道读写时,相互要求对方先读/写

假如 相互要求对方先读/写,本身 再读/写,就会造成死锁。

  1. func main() {
  2. chHusband := make(chan int,0)
  3. chWife := make(chan int,0)
  4. go func() {
  5. select {
  6. case <- chHusband:
  7. chWife<-888
  8. }
  9. }()
  10. select {
  11. case <- chWife:
  12. chHusband <- 888
  13. }
  14. }
复制代码

先来看看妻子 协程,chWife只要能读出来,也就是妻子 有钱,就给老公发个八百八十八的大红包。

再看看老公的协程,一看不得了,咋啦?老公也说只要他有钱就给妻子 包个八百八十八的大红包。

两个人都说本身 没钱,老公也给妻子 发不了红包,妻子 也给老公发不了红包,这就是死锁!

第四种环境 :读写锁相互壅闭 ,形成隐形死锁

先来看一看代码:

  1. func main() {
  2. var rmw09 sync.RWMutex
  3. ch := make(chan int,0)
  4. go func() {
  5. rmw09.Lock()
  6. ch <- 123
  7. rmw09.Unlock()
  8. }()
  9. go func() {
  10. rmw09.RLock()
  11. x := <- ch
  12. fmt.Println("读到",x)
  13. rmw09.RUnlock()
  14. }()
  15. for {
  16. runtime.GC()
  17. }
  18. }
复制代码

这两条协程,假如 第一条协程先抢到了只写锁,另一条协程就不能抢只读锁了,那么由于 别的 一条协程没有读,以是 第一条协程就写不进。

假如 第二条协程先抢到了只读锁,另一条协程就不能抢只写锁了,那么由于 别的 一条协程没有写,以是 第二条协程就读不到。

到此这篇关于详解Golang并发操作中常见的死锁环境 的文章就先容 到这了,更多相干 Golang 并发死锁内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 塞翁364 | 2021-9-25 08:15:19 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 紫色214 | 2021-9-29 15:09:05 | 显示全部楼层
很多天不上线,一上线就看到这么给力的帖子!
回复

使用道具 举报

avatar 护研的墙偃 | 2021-9-30 17:37:01 | 显示全部楼层
admin楼主练了葵花宝典吧?
回复

使用道具 举报

avatar 半老徐爷椒 | 2021-10-5 11:47:52 | 显示全部楼层
这么版块的帖子越来越有深度了!
回复

使用道具 举报

avatar 雨荷424 | 2021-10-10 08:03:25 | 显示全部楼层
我对admin楼主的敬仰犹如滔滔江水绵延不绝!
回复

使用道具 举报

avatar 123457242 | 2021-10-10 21:27:41 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

avatar 123456806 | 前天 01:11 | 显示全部楼层
支持一下!
回复

使用道具 举报

admin楼主会死的很有节奏的!
回复

使用道具 举报

avatar 悲新座客 | 前天 01:51 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则