Go程序陷入死锁

2024-03-25

这是我的 Golang 程序,我正在使用它只是为了让我的概念正确。 当我运行程序时,它陷入僵局,我不明白为什么? 请有人指出出了什么问题吗?

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {

    numOfGoRoutines := 10
    wg.Add(numOfGoRoutines)
    ch := make(chan int, numOfGoRoutines)

    for i := 0; i < numOfGoRoutines; i++ {
        a := i
        go sqr(ch, a, wg)
    }
    wg.Wait()
    fmt.Println("After WAIT")
    close(ch)
    var res int
    for i := range ch {
        res += i
    }
    ch = nil
    fmt.Println("result = ", res)

}

func sqr(ch chan int, val int, wg sync.WaitGroup) {
    fmt.Println("go - ", val)
    s := val * val
    ch <- s
    wg.Done()
}

输出是:

warning: GOPATH set to GOROOT (C:\\Go) has no effect
go -  9
go -  0
go -  1
go -  2
go -  3
go -  4
go -  5
go -  6
go -  7
go -  8
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0x5bcabc)
        C:/Go/src/runtime/sema.go:47 +0x2d
sync.(*WaitGroup).Wait(0x5bcab0)
        C:/Go/src/sync/waitgroup.go:127 +0xbb
main.main()
        C:/demo/go-work/main.go:20 +0xdf
exit status 2

问题是你正在传递一个副本sync.WaitGroup到 goroutine,而不是引用(即指针):

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {

    numOfGoRoutines := 10
    wg.Add(numOfGoRoutines)
    ch := make(chan int, numOfGoRoutines)

    for i := 0; i < numOfGoRoutines; i++ {
        a := i
        go sqr(ch, a, &wg)
    }
    wg.Wait()
    fmt.Println("After WAIT")
    close(ch)
    var res int
    for i := range ch {
        res += i
    }
    ch = nil
    fmt.Println("result = ", res)

}

func sqr(ch chan int, val int, wg *sync.WaitGroup) {
    fmt.Println("go - ", val)
    s := val * val
    ch <- s
    wg.Done()
}

另外,由于wg是一个全局变量,您可以完全删除该参数:

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {

    numOfGoRoutines := 10
    wg.Add(numOfGoRoutines)
    ch := make(chan int, numOfGoRoutines)

    for i := 0; i < numOfGoRoutines; i++ {
        a := i
        go sqr(ch, a)
    }
    wg.Wait()
    fmt.Println("After WAIT")
    close(ch)
    var res int
    for i := range ch {
        res += i
    }
    ch = nil
    fmt.Println("result = ", res)

}

func sqr(ch chan int, val int) {
    fmt.Println("go - ", val)
    s := val * val
    ch <- s
    wg.Done()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go程序陷入死锁 的相关文章

  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • 在 Go to 函数中通过引用和值传递

    我对 Go 中通过引用和值传递有点困惑 我已经看到过对类型前面的 的解释 在类型名称前面 表示声明的变量将存储该类型的另一个变量的地址 而不是该类型的值 类型 这对我来说毫无意义 在Java中 如果我将数据库实例传递给函数 我会这样做 da
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 什么时候返回结构体指针是个好主意?

    我正在学习 Go 我对何时使用指针有点困惑 具体来说 当返回一个struct从函数中 什么时候适合返回结构体实例本身 什么时候适合返回指向结构体的指针 示例代码 type Car struct make string model strin
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 我们如何在 Go 中使用通道来代替互斥锁?

    通道将通信 值的交换 与同步相结合 保证两个计算 goroutine 处于已知状态 如何使用 Google Go 中的通道来执行互斥量的功能 package main import sync var global int 0 var m s

随机推荐

  • Java - 如何测试 Catch 块?

    有点转发 但是关于没有足够声誉的第 22 条军规意味着我无法对任何重复的线程发表评论 咳嗽 我正在尝试使用 Mockito 测试 try catch 的 catch 块 是否可以使模拟抛出由正在测试的方法处理的异常 我无法使用 doThro
  • 为什么 return 不遵守finally 块中变量的值?

    finally总是最后执行 所以语句x 3应该最后执行 但是 运行此代码时 返回的值为 2 Why class Test public static void main String args System out println fina
  • 使用 AVPlayer 进行串流速度很慢

    我使用 AVPlayer 从互联网上传输 mp3 文件 但它的运行速度非常慢 使用探查器 我发现它首先下载整个文件 然后开始播放 有什么解决方法吗 现在 我正在使用这段代码 if let player player Notification
  • 使用预先签名的 URL 将文件放入 S3

    我整夜都在使用 Amazon S3 预签名 URL 来尝试 PUT 文件 我在 java 代码中生成预签名 URL AWSCredentials credentials new BasicAWSCredentials accessKey s
  • iPhone : 自定义标签栏,没有可怕的“更多”菜单

    所以我想构建一个具有超过 5 个项目并且可滚动的选项卡栏并找到本文 http www rumex it 2010 11 how to customise the tab bar uitabbar in an iphone applicati
  • “OpenCV”被视为未找到

    Linux 风格 Debian Crunch Bang 出现问题 尝试使用以下命令构建 cvblob 时 cd cvblob cmake Error CMake Error at cvBlob CMakeLists txt 20 find
  • NuGet 如何将属性应用于文件

    我正在创建 NuGet 包 我已经放入了两个文件content用户安装此软件包时将添加的文件夹 exe 和配置文件 另外我想更改这两个文件的 VS 项目属性 构建包时我需要做什么 当您说 应用属性更改 时 您是指文件系统属性 例如上次修改时
  • 通过 Xcode 发布时:下载的软件组件已损坏且无法使用

    在尝试通过 Xcode 发布 iOS 应用程序并通过大部分验证后 我收到以下错误 下载的软件组件已损坏且无法使用 https contentdelivery itunes apple com transporter repositories
  • 如何使用 Fabric.js 在画布上画一条线

    我正在使用 Fabric js 在画布上画一条线 这是我的代码 但我没有得到任何输出 Line click function alert Line canvas add new fabric Line 50 100 200 200 left
  • 使用 php 创建像 Twitter 或 Convore 这样的提及

    你好 我只是好奇 关于他们如何做事 我认为他们会做这样的事情 someone1 im stacking on stackoverflow RT someone2 hello guys what are you doing 在我以我的方式做之
  • 静态库 API 问题(std::string 与 char*)

    我以前没有使用过静态库 但现在我需要 设想 我正在 Unix 中编写一个控制台应用程序 我自由使用std string无处不在 因为这样做很容易 然而 我最近发现我必须在 Windows 中支持它 并且第三方应用程序需要 API 来连接我的
  • 使用 iText 检测动态 XFA

    我需要将预先填充的 PDF XFA 表单设置为只读 因为没有输入 例如文本 复选框 单选按钮等可以更改其值 对于常规 AcroForms PDF 和静态 XFA 表单 我可以通过调用来完成此操作setFormFlattening true
  • 为什么python的subprocess.call是这样实现的?

    subprocess模块 具有便捷的功能call 在2 6和3 1中都是这样实现的 def call popenargs kwargs return Popen popenargs kwargs wait 该函数的文档带有红色警告 内容如下
  • 多用户应用程序无需安装任何东西 - 允许并发用户写入的嵌入式数据库? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要创建一个应用程序 被多个用户同时使用 不需要any安装 有一个集中的数据存储 数据必须被存储inside公司网络 i 无权访问到公司内部数
  • 更新 UpdatePanel 内的标签

    我在更新面板中有一个标签和按钮 当我尝试从按钮单击上的标签获取值时 我从标签获取值 但是当我尝试将值设置为标签时 它不会发生 我检查了 JavaScript 错误 但没有任何错误 有人猜测可能是什么原因吗 我正在使用 dotnetnuke
  • 程序“[4432] iisexpress.exe”已退出,代码为-2147023895 (0x800703e9)

    我在使用 IIS Express 时遇到了非常令人沮丧的问题 当我开始调试时一切正常 但在几次请求后 IIS 挂起并崩溃 我的浏览器 Chrome 版本 37 0 2062 120 m 等待响应几秒钟 然后 IIS Express 停止运行
  • 在 webview android 中启用复制和粘贴

    是否可以从网络视图中选择文本然后进行复制和粘贴 有什么特殊的方法可以做到这一点吗 请帮助我 希望对你有帮助 public void selectAndCopyText try Method m WebView class getMethod
  • 如何在启用协程的改造界面中重试 API 调用

    我有一个用例 每当 API 调用中发生诸如互联网丢失或未知错误之类的一般错误时 需要显示带有重试按钮的错误 UI 当用户按下重试之前失败的 API 时 应该调用并恢复用户流程 迁移协程方法前的API接口 interface TodoServ
  • 如何更改单选按钮的文本

    我有一个单选按钮 需要根据用户输入动态更新 但正常情况下 val text and html 行不通的 如何使用 jQuery 或纯 JavaScript 更改单选按钮的文本 无线电输入没有文字 一切都是这样的
  • Go程序陷入死锁

    这是我的 Golang 程序 我正在使用它只是为了让我的概念正确 当我运行程序时 它陷入僵局 我不明白为什么 请有人指出出了什么问题吗 package main import fmt sync var wg sync WaitGroup f