iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >waitgroup.Wait() 导致死锁
  • 484
分享到

waitgroup.Wait() 导致死锁

2024-04-04 23:04:43 484人浏览 安东尼
摘要

小伙伴们有没有觉得学习golang很有意思?有意思就对了!今天就给大家带来《waitgroup.Wait() 导致死锁》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到

小伙伴们有没有觉得学习golang很有意思?有意思就对了!今天就给大家带来《waitgroup.Wait() 导致死》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我试图找出为什么我与 waitgroup.wait() 发生死锁

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func foo(c chan int, i int) {
    defer wg.Done()
    c <- i
}

func main() {
    ch := make(chan int)
    for i := 0; i < 10; i++ {
        wg.Add(1)
        Go foo(ch, i)
    }
    wg.Wait()
    close(ch)
    for item := range ch {
        fmt.Println(item)
    }
}

当我像这样运行它时,它会打印 fatal error: all goroutine are sleep - deadlock!

我尝试将 ch 更改为缓冲通道,这解决了问题。但我很想知道为什么会出现死锁。


正确答案


我已经注释掉了你的程序逻辑不正确的部分:

package main

import (
    "fmt"
    "sync"
)

var wg sync.waitgroup

func foo(c chan int, i int) {
    defer wg.done()
    c <- i
}

func main() {
    ch := make(chan int) // unbuffered channel

    for i := 0; i < 10; i++ {
        wg.add(1)
        go foo(ch, i)
    }

    // wg.wait is waiting for all goroutines to finish but that's
    // only possible if the send to channel succeeds. in this case,
    // it is not possible as your receiver "for item := range ch" is below
    // this. hence, a deadlock.
    wg.wait()

    // ideally, it should be the sender's duty to close the channel.
    // and closing a channel before the receiver where the channel
    // is unbuffered is not correct.
    close(ch)

    for item := range ch {
        fmt.println(item)
    }
}

更正的程序:

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func foo(c chan int, i int) {
    defer wg.Done()
    c <- i
}

func main() {
    ch := make(chan int)

    go func() {
        for item := range ch {
            fmt.Println(item)
        }
    }()

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go foo(ch, i)
    }

    wg.Wait()
    close(ch)
}

终于介绍完啦!小伙伴们,这篇关于《waitgroup.Wait() 导致死锁》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!

您可能感兴趣的文档:

--结束END--

本文标题: waitgroup.Wait() 导致死锁

本文链接: https://www.lsjlt.com/news/596784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • waitgroup.Wait() 导致死锁
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《waitgroup.Wait() 导致死锁》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到...
    99+
    2024-04-04
  • update导致死锁
    update delete 操作,如果走的索引,对索引和主键索引加行锁 如果没有走索引,锁整张表。 不开启事务,mysql本身也会加锁 一般MYSQL在执行CREATE,ALTER,INSE...
    99+
    2023-09-09
    数据库 mysql java
  • chan chan 构造导致死锁
    问题内容 我试图通过编写一小段代码来理解 Go 中的 chan chan 构造,如下所示,我希望 3 个工作子例程处理 10 个作业。每个工作子例程都有自己的通道,在其中接收要处理的“...
    99+
    2024-02-06
  • mysql insert导致死锁的案例介绍
    本篇内容介绍了“mysql insert导致死锁的案例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两...
    99+
    2024-04-02
  • 单线程会导致死锁你知道吗
    死锁从文字理论上说明的是两个线程,可以认为是两个人A和B,A在等待B完成某件事情,B又在等待A完成某件事情。 那如果在代码中,单线程的某个函数,有没有可能导致死锁呢? 我们看下面的...
    99+
    2024-04-02
  • 简单的通道并行示例,导致死锁
    大家好,我们又见面了啊~本文《简单的通道并行示例,导致死锁》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面...
    99+
    2024-04-04
  • update.where无索引导致MySQL死锁问题解决
    目录引言死锁的日志分析日志复盘总结引言 随着我被拉入一个新的群聊“生产环境死锁问题排查解决”,打破了午后的悠然惬意,点开群聊秒送了一个648超级大礼包(业务不正常,死锁异常日志输出),领导怒斥并要...
    99+
    2024-04-02
  • redis链接高并发导致锁死怎么解决
    当Redis遇到高并发的情况可能会导致锁死,可以考虑以下几种解决办法:1. 使用分布式锁:通过使用分布式锁,可以将锁的控制权交给其他...
    99+
    2023-08-23
    redis
  • 多线程update导致的mysql死锁问题处理方法
    最近想起之前处理过的一个mysql 死锁问题,是在高并发下update批量更新导致的,这里探讨一下发生的原因,以及解决办法; 发生死锁的sql语句如下,其中where条件后的字段是有复合索引的。 update t_push_mes...
    99+
    2023-09-06
    数据库 java 开发语言 mysql死锁问题 mysql
  • 怎么解决死锁导致网站无法访问故障
    这篇文章主要介绍了怎么解决死锁导致网站无法访问故障,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  如何解决死锁导致网站无法访问故障  问题...
    99+
    2024-04-02
  • 浅谈Java由于不当的执行顺序导致的死锁
    我们来讨论一个经常存在的账户转账的问题。账户A要转账给账户B。为了保证在转账的过程中A和B不被其他的线程意外的操作,我们需要给A和B加锁,然后再进行转账操作, 我们看下转账的代码: ...
    99+
    2024-04-02
  • 电脑更新windows KB3001652补丁后导致计算机被锁死怎么办?
    在本月的“补丁星期二”那天,微软照例为该公司旗下的许多产品发布了补丁。但是在这其中,有一个编号为KB3001652的问题补丁的计算机。根据官网给出的细节 当然,微软的反应也算相当迅速了。在看到来...
    99+
    2023-06-11
    KB3001652补丁 电脑蓝屏 windows补丁 windows KB3001652 计算机 电脑
  • 为什么在这种情况下主协程会被阻塞从而导致死锁?
    在PHP中,主协程被阻塞导致死锁的情况是比较常见的。主协程在执行过程中,如果遇到阻塞的操作,比如网络请求、IO操作或者等待其他协程结果等,如果没有合适的处理方式,就有可能导致死锁的发生...
    99+
    2024-02-09
  • 死锁(JAVA)
    死锁在多线程代码中是非常严重的BUG,一旦代码中出现死锁就会导致线程卡死。 当单个线程连续两次对同一个对象进行加锁操作时,如果该锁是不可重入锁就会发生死锁(线程卡死) 两个线程两把锁,如果出现这种情况也是会发生死锁:线程t1已经获取了锁A,...
    99+
    2023-12-22
    java java-ee
  • Redis使用不当导致应用卡死怎么办
    本篇内容介绍了“Redis使用不当导致应用卡死怎么办”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先说下...
    99+
    2024-04-02
  • MySql类型转换导致行锁升级为表锁的示例
    小编给大家分享一下MySql类型转换导致行锁升级为表锁的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在MySql的写语句中,给表列赋值与表类型不符合时,MySql底层的优化器发挥作用...
    99+
    2024-04-02
  • redis使用不当导致应用卡死bug怎么办
    这篇文章主要介绍redis使用不当导致应用卡死bug怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应...
    99+
    2023-06-20
  • MySQL UPDATE语句是否会导致表被锁定?
    MySQL UPDATE语句是否会导致表被锁定? MySQL 是一个流行的关系型数据库管理系统,广泛用于各种应用程序中。在数据库操作中,UPDATE 语句用于更新表中的数据。但是,一个...
    99+
    2024-03-15
    mysql update 锁定
  • 为什么下面的 go 程序会出现死锁错误“致命错误:所有 goroutine 都在睡眠 - 死锁!”
    在Go语言中,死锁是一个常见的错误,当所有的goroutine都处于睡眠状态时,就会出现致命错误:"致命错误:所有goroutine都在睡眠 - 死锁!"。这种情况通常发生在多个gor...
    99+
    2024-02-09
    go语言
  • Win7电脑经常死机如何移除导致死机的老旧驱动设备
      一些老旧的或者未使用的设备驱动在Win7系统中   按照下面步骤进行:   1、右键Win7桌面的“计算机”,选择“属性”。   2、在左侧面板上找到“高级...
    99+
    2023-06-07
    驱动设备 Win7 死机 电脑 驱动 设备
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作