golang goroutine同步预期行为

  • 本文关键字:goroutine 同步 golang go
  • 更新时间 :
  • 英文 :


以下代码试图发送到主goroutine上的通道,并从另一个goroutine接收,但有几次它按预期返回,但也有几次退出,而没有在控制台屏幕上打印任何

package main
import "fmt"
func main() {
ch := make(chan bool)
go func() {
data := <-ch
fmt.Printf("Received: %t", data)
}()
ch <- true
}

同时,下面的代码每次都按预期工作,一个不同之处是添加了一个额外的检查来检查通道是否关闭,这总是抛出相同的预期输出。这是否确保了对通道的检查是必须的而不是可选的?或者代码有什么问题

package main
import "fmt"
func main() {
ch := make(chan bool)
go func() {
data, ok := <-ch
if !ok {
fmt.Println("Channel closed")
return
}
fmt.Printf("Received: %t", data)
}()
ch <- true
}

在退出主例程之前,您应该等待goroutine完成。

package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan bool)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
data := <-ch
fmt.Printf("Received: %t", data)
}()
ch <- true
wg.Wait()
}

问题是您的第二段代码每次都不会打印Received:true。我测试了好几次。

正如@jub0bs提到的,不能保证你的goroutine在主例程之前完成。你必须自己控制它。

最新更新