小编典典

多线程控制台输出?

go

如果我有多个go例程,并且其中两个或两个以上例程决定需要打印某些内容,那么它们是否可能彼此中断?

例如:

package main

import (
    "fmt"
)

func main() {
    go print()
    print()
}

func print() {
    for true {
        fmt.Print("ABCDEF")
    }
}

是否有可能一个常规程序开始打印(AB),而另一个常规程序中断(ABABCDEF)和原始装订(ABABCDEFCDEF)?

我尝试自己运行它并检查输出,它 看起来 不错,但是如何确定?


阅读 365

收藏
2020-07-02

共1个答案

小编典典

是的,有可能,尽管GOMAXPROCS =
1不会显示任何内容。当使用更多goroutine,更大的行和更多的线程运行时,它们将显示出来。写入无缓冲的stderr时更是如此,因为stdout缓冲区接受短写的速度足够快以帮助防止交错。

这就是为什么“ log”包中的Logger具有内部互斥体和缓冲区以正确序列化调用的原因。

2020-07-02