本文介绍了去程序越来越僵局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 这是我正在玩的Golang程序,目的只是为了让我的概念正确。 当我运行程序时,它陷入了僵局,我不明白为什么? 请大家指出发生了什么问题? 包主 导入(fmtsync) var wg sync.WaitGroup func main(){ numOfGoRoutines:= 10 wg.Add(numOfGoRoutines) ch:= make(chan int,numOfGoRoutines) for i:= 0;我< numOfGoRoutines; i ++ {a:= i 转到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 wg.Done()} 输出结果为: 警告: GOPATH设置为GOROOT(C:\\ Go)无效去 - 9 去 - 0 去 - 1 去 - 2 去 - 3 去 - 4 去 - 5 去 - 6 去 - 7 去 - 8 致命错误:所有goroutines都睡着了 - 死锁! 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 退出状态2 解决方案问题是,您正在将 sync.WaitGroup 的副本传递给goroutines,而不是引用(即指针): 包主 $ b导入(fmt同步) var wg sync.WaitGroup func main(){ numOfGoRoutines:= 10 wg.Add(numOfGoRoutines) ch:= make(chan int,numOfGoRoutines) for i:= 0;我< numOfGoRoutines; i ++ {a:= i 转到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 wg.Done()} 此外,由于 wg 是一个全局变量,因此您可以删除参数完全: package main import(fmt同步) var wg sync.WaitGroup func main(){ numOfGo例程:= 10 wg .Add(numOfGoRoutines) ch:= make(chan int,numOfGoRoutines) for i:= 0;我< numOfGoRoutines; i ++ {a:= i 转到sqr(ch,a)} wg.Wait() fmt.Println(After WAIT)关闭(ch) var res int 为i:=范围ch { res + = i } ch = nil fmt.Println (result =,res) } func sqr(ch chan int,val int){ fmt.Println(go - ,val )s:= val * val ch wg.Done()} Here is my Golang program which I am playing with just to get my concepts right.When I run the program it is deadlocked I don't understand why ?Please anyone point out what is going wrong ?package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc 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()}and the output is: warning: GOPATH set to GOROOT (C:\\Go) has no effectgo - 9go - 0go - 1go - 2go - 3go - 4go - 5go - 6go - 7go - 8fatal error: all goroutines are asleep - deadlock!goroutine 1 [semacquire]:sync.runtime_Semacquire(0x5bcabc) C:/Go/src/runtime/sema.go:47 +0x2dsync.(*WaitGroup).Wait(0x5bcab0) C:/Go/src/sync/waitgroup.go:127 +0xbbmain.main() C:/demo/go-work/main.go:20 +0xdfexit status 2 解决方案 The problem is that you're passing a copy of sync.WaitGroup to the goroutines, rather than a reference (i.e. a pointer):package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc 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()}Additionally, since wg is a global variable, you could just remove the parameter entirely:package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc 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()} 这篇关于去程序越来越僵局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!