多线程控制台输出?

3

如果我有多个go协程正在运行,其中两个或更多个决定需要打印输出,它们是否会相互中断?

例如:

package main

import (
    "fmt"
)

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

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

一个go协程是否可能开始打印(AB),另一个go协程中断(ABABCDEF),最初的协程完成(ABABCDEFCDEF)?

我尝试运行了一下并检查了输出结果,看起来是正确的,但我如何确保它没有问题呢?

1个回答

4

是的,这是可能的,但当GOMAXPROCS=1时,您将看不到任何东西。当使用更多的goroutines、更长的行和更多的线程运行时,它们会显示出来。特别是在写入stderr时,因为stdout缓冲区接受足够快的短写入来帮助防止交错。

这就是为什么"log"包中的Logger具有内部互斥锁和缓冲区,以正确地序列化调用。


那么,明确地说,使用 log 包意味着线程永远不会相互中断? - Corey Ogburn
1
@CoreyOgburn:是的,只要您只使用一个Logger进行编写,而不是从任何其他地方编写(例如,任何fmt.Printfs可能会与日志行重叠)。 - JimB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接