我正在做一些调试,并且有一些这样的代码:
go func() {
if !finished {
fmt.Println("Writing the data")
writer.Write(data)
}
}()
finished
变量旨在防止写入已关闭的写入器。但是,它没有用。它似乎正在通过旗帜。我确定对Println的调用产生了goroutine,这可以允许在检查标志之后但在尝试写入之前关闭写入器。果然,删除该呼叫似乎已解决。但是,我想进行验证,更重要的是,寻求有关如何正确避免这种情况的建议,而不仅仅是避免在那里打印。
答案 0 :(得分:1)
是的,任何I / O(包括fmt.Println
都可能导致goroutine执行暂停。
但是实际上,这并不重要,因为在任何具有多个CPU内核的现代硬件上,即使goroutine没有暂停,您也可以体验比赛。
您应该始终确保代码并发安全。