如果我有多个go例程,并且其中两个或两个以上例程决定需要打印某些内容,那么它们是否可能彼此中断?
例如:
package main import ( "fmt" ) func main() { go print() print() } func print() { for true { fmt.Print("ABCDEF") } }
是否有可能一个常规程序开始打印(AB),而另一个常规程序中断(ABABCDEF)和原始装订(ABABCDEFCDEF)?
AB
ABABCDEF
ABABCDEFCDEF
我尝试自己运行它并检查输出,它 看起来 不错,但是如何确定?
是的,有可能,尽管GOMAXPROCS = 1不会显示任何内容。当使用更多goroutine,更大的行和更多的线程运行时,它们将显示出来。写入无缓冲的stderr时更是如此,因为stdout缓冲区接受短写的速度足够快以帮助防止交错。
这就是为什么“ log”包中的Logger具有内部互斥体和缓冲区以正确序列化调用的原因。