在fmt.Println调用期间,goroutine可以入睡吗?

时间:2019-01-03 03:32:40

标签: go

我正在做一些调试,并且有一些这样的代码:

go func() {
        if !finished {
                fmt.Println("Writing the data")
                writer.Write(data)
        }
}()

finished变量旨在防止写入已关闭的写入器。但是,它没有用。它似乎正在通过旗帜。我确定对Println的调用产生了goroutine,这可以允许在检查标志之后但在尝试写入之前关闭写入器。果然,删除该呼叫似乎已解决。但是,我想进行验证,更重要的是,寻求有关如何正确避免这种情况的建议,而不仅仅是避免在那里打印。

1 个答案:

答案 0 :(得分:1)

是的,任何I / O(包括fmt.Println都可能导致goroutine执行暂停。

但是实际上,这并不重要,因为在任何具有多个CPU内核的现代硬件上,即使goroutine没有暂停,您也可以体验比赛。

您应该始终确保代码并发安全。