欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的死锁

发布时间:2025/6/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 golang中的死锁 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

简介

出现死锁的情况

  • 单go协程自己死锁
  • go协程之间channel访问顺序导致死锁
  • 多go协程,多channel交叉死锁

尽量不要将读写锁和互斥锁和channel混用,有可能造成隐式死锁,还不报错

单go协程自己死锁

channel至少在2个协程中进行

func main() {s:= make(chan int)//写入channel,写端阻塞,阻塞当前,下面就全部阻塞了,就没机会执行了s<-11//他能解锁,但是已经被阻塞了m := <-sfmt.Println(m) }

输出

fatal error: all goroutines are asleep - deadlock!

go协程之间channel访问顺序导致死锁

使用一端写的时候,保证另一端有机会读取,代码写下面

func main() {ch:= make(chan int)//读取,阻塞,阻塞了下面就不执行了,除非把他放在go func的下面m := <-chfmt.Println(m)go func() {//他能解锁,但是主程序在之前就阻塞了ch <- 11}() }

多go协程,多channel交叉死锁

func main() {ch1 := make(chan int)ch2 := make(chan int)go func() { //子for {select {//读操作阻塞case num := <-ch1://写ch2 <- num}}}()for { //主select {//读case num := <-ch2://写ch1 <- num}} }

总结

以上是生活随笔为你收集整理的golang中的死锁的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。