多线程控制台输出?

如果我有多个 go-routines 并且其中 2 个或更多的人决定他们需要打印一些东西,他们是否有可能互相打断?


例如:


package main


import (

    "fmt"

)


func main() {

    go print()

    print()

}


func print() {

    for true {

        fmt.Print("ABCDEF")

    }

}

是否有可能一个 go-routine 开始打印(AB)而另一个 go-routine 中断(ABABCDEF)和原始完成(ABABCDEFCDEF)?


我试过自己运行它并检查输出,它看起来不错,但我怎么能确定呢?


侃侃尔雅
浏览 202回答 1
1回答

摇曳的蔷薇

是的,这是可能的,尽管您不会看到 GOMAXPROCS=1 的任何内容。当运行更多的 goroutine、更大的行和更多的线程时,它们会出现。在写入无缓冲的 stderr 时更是如此,因为 stdout 缓冲区足够快地接受短写入以帮助防止交错。这就是“log”包中的 Logger 具有内部互斥锁和缓冲区的原因,以正确序列化调用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go