试图理解围棋中的"sync"。为什么会这样?

  • 本文关键字:sync 解围 围棋 go
  • 更新时间 :
  • 英文 :


"这个程序应该转到11,但有时它只打印1到10。修复代码并解释原因"是任务。我正在努力理解为什么这个代码有效。如果只是我在添加";汇编代码";以便Print能够打印最后11个。

所以我的问题是:当我添加wg时,为什么这段代码能打印出最后11个。在关闭后等待((?我是我的头,我想添加wg。在关闭(ch(之前等待((,这样通道在我们完成之前就不会关闭,但这会给我们带来死锁,因为我们会永远等待从通道接收更多值。

感谢

原始代码没有与";sync";。

func main() {
ch := make(chan int)
var wg sync.WaitGroup // added code
wg.Add(1) // added code
go Print(ch, &wg) // added code (&wg)
for i := 1; i <= 11; i++ {
ch <- i
}
close(ch)
wg.Wait() // added code
}
// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
func Print(ch <-chan int, wg *sync.WaitGroup) { // added code (wg *sync.WaitGroup)
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
wg.Done() // added code
}

如果没有wg.Wait,主goroutine可能会在第二个goroutine完成打印之前终止。

您使用的通道没有缓冲区,因此每当主goroutine通过通道发送值时,goroutine都会接收该值。但是,这并不能保证打印该值。主goroutine可以在打印完成之前开始预期,并可以终止程序。waitgroup是确保主goroutine等待打印goroutine完成所必需的。

最新更新