警惕!Channel使用中的隐形杀手——Deadlock详解,教你如何避开陷阱!

 2026-01-31 09:36:08  4 浏览  0 评论   赞

警惕!Channel使用中的隐形杀手——Deadlock详解,教你如何避开陷阱!

图106123-1:

常见的错误:

golang fatal error: all goroutines are asleep - deadlock!

实例:

package main import ( "fmt" "sync" ) var ( count int rwLock sync.RWMutex // ch chan bool ) func main() { // Error: fatal error: all goroutines are asleep - deadlock // 解决方法: 通道正确的定义方法: ch := make(chan bool) go func() { for i := 0; i < 2; i++ { for i := 1000000; i > 0; i-- { rwLock.Lock() // 使用写锁定 count++ rwLock.Unlock() // 使用写锁定 } } // 通知 通道 上述计算任务完成 ch <- false }() <-ch fmt.Println("汇总", count) // 汇总 2000000 }实例:

package main import ( "fmt" ) func afuntion(ch chan int) { fmt.Println("finish") <-ch } func main() { ch := make(chan int) //fatal error: all goroutines are asleep - deadlock! /* ch <- 1 go afuntion(ch) */ // 解决方法: 接收者语句放在 发送语句的前面, 结论: 在阻塞的情况下, 不能创建的新的协程 go afuntion(ch) ch <- 1 } /*解释:

1. 创建了一个无缓冲channel

2. 启动了一个goroutine,这个routine中对channel执行取出操作,但是因为这时候channel为空,所以这个取出操作发生阻塞,但是主routine可没有发生阻塞,程序继续运行

3. 往channel中放入了一个数据

4. 这时阻塞的那个routine检测到了channel中存在数据了,所以接触阻塞,从channel中取出数据,程序就此完毕

*/

实例:

package main import ( "fmt" "time" ) func main() { c := make(chan int) go func() { for i := 0; i < 10; i++ { c <- i } }() hold(c) } func hold(c <-chan int) { //golang fatal error: all goroutines are asleep - deadlock! /* for { time.Sleep(1 * time.Second) fmt.Println(<-c) } */ // 解决方法: select 语句 for { select { case <-c: time.Sleep(1 * time.Second) fmt.Println(<-c) default: } } fmt.Println("hold on ...") }这个错误的原因是:

在main goroutine线, 期望从管道中获得一个数据, 而这个数据必须是其他goroutine线放入管道的

但是其他goroutine线都已经执行完了(all goroutines are asleep),那么就永远不会有数据放入管道。

所以, main goroutine线在等一个永远不会来的数据, 那整个程序就永远等下去了。

这显然是没有结果的, 所以这个程序就说"算了吧, 不坚持了, 我自己自杀掉, 报一个错给代码作者, 我被deadlock了"

结论: 在阻塞的情况下, 不能创建的新的协程

来源:今日头条

作者:寒笛过霜天

点赞:0

评论:0

标题:channel常见的错误——deadlock

原文:https://www.toutiao.com/article/7355039000194761235

侵权告知删除:yangzy187@126.com

转载请注明:网创网 www.netcyw.cn/b106123.html

()
发表评论
  • 昵称
  • 网址
(0) 个小伙伴发表了自己的观点
    暂无评论

Copyright © 2018-2022 小王子工作室 版权所有 滇ICP备14007766号-3 邮箱:yangzy187@126.com