多线程控制台输出?

时间:2015-07-30 21:17:43

标签: multithreading go

如果我有多个常规程序,并且其中有两个或多个决定需要打印出来的东西,那么它们是否可能互相打断?

例如:

package main

import (
    "fmt"
)

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

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

一个常规例程是否可以开始打印(AB)和另一个例程中断(ABABCDEF)和原始完成(ABABCDEFCDEF)?

我已经尝试自己运行并检查输出,看起来很好,但我怎么能确定?

1 个答案:

答案 0 :(得分:4)

是的,这是可能的,尽管GOMAXPROCS = 1你看不到任何东西。它们会在运行更多goroutine,更大的线条和更多线程时出现。写入无缓冲的stderr时更是如此,因为stdout缓冲区足够快地接受短写入以帮助防止交错。

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