我是Go语言的新手,并在这里学习: https://tour.golang.org/concurrency/1
当我运行https://play.golang.org/p/9JvbtSuv5o时,结果为:
world
hello
hello
因此添加了sync.WaitGroup
:https://play.golang.org/p/vjdhnDssGk
package main
import (
"fmt"
"sync"
"time"
)
var w sync.WaitGroup
func say(s string) {
for i := 0; i < 2; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
w.Done()
}
func main() {
w.Add(1)
go say("world")
say("hello")
w.Wait()
}
但结果是一样的:
world
hello
hello
我的代码出了什么问题?
请帮忙,
谢谢你的帮助。
答案 0 :(得分:0)
w.Done()
递减WaitGroup
计数器
因此,您的代码有时会出现恐慌:同步:负WaitGroup
计数器。
你有两个Goroutines:
1 - go say("world")
2 - say("hello")
在main
Goroutine内
所以使用w.Add(2)
,请参阅此工作示例(The Go Playground):
package main
import (
"fmt"
"sync"
"time"
)
var w sync.WaitGroup
func say(s string) {
for i := 0; i < 2; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
w.Done()
}
func main() {
w.Add(2)
go say("world")
say("hello")
w.Wait()
}
输出:
world
hello
hello
world
我希望这会有所帮助。
答案 1 :(得分:0)
您只是向WaitGroup添加1,但是从say
的2次调用中调用Done。
在您的示例中,使用2启动WaitGroup将起作用
w.Add(2)
答案 2 :(得分:0)
由于无条件调用w.Done()而出现问题。所以,当你打电话说(“你好”)时,这也减少了对waitGroup的反击。
参考https://play.golang.org/p/wJeAyYyjA2
~/myprogram/