【发布时间】:2019-08-20 06:36:08
【问题描述】:
我正在尝试了解如何解决以下代码的这种竞争条件。
sayHello := func() {
fmt.Println("Hello from goroutine")
}
go sayHello()
time.Sleep(1)
fmt.Println("Hello, playground")
期望:我只是想知道最好的解决方案是什么,我应该使用 WaitGroup 还是有更好的解决方案?
所以我想出了以下解决方案:
var wg sync.WaitGroup
//defer wg.Wait()
sayHello := func() {
defer wg.Done()
fmt.Println("Hello from goroutine")
}
wg.Add(1)
go sayHello()
wg.Wait()
fmt.Println("Hello, playground")
但它会阻塞主 goroutine 直到代码被执行!
同样,如果我使用defer wg.Wait(),输出会有所不同! https://play.golang.org/p/_xkLb7HvNF8
竞争条件我的意思是go sayHello() 甚至永远不会被执行,因为主函数将在 goroutine 开始之前完成执行。因此,如果我尝试设置 time.Sleep,它会产生竞争条件
【问题讨论】:
-
竞态条件是什么?你希望 goroutine 的打印在 main 的打印之前显示?
-
我没有看到竞争条件。
-
竞争条件 我的意思是
go sayHellow()甚至永远不会被执行,因为主函数会在 goroutine 开始之前完成执行。因此,如果我尝试设置时间,它会创建一个竞争条件。睡眠
标签: go concurrency goroutine