goroutine调用线路后面的线路是否早于goroutine的第一行开始?



这是代码:

import "fmt"
func main() {
messages := make(chan string, 1)
go func(c chan string) {
c <- "Hi"
}(messages)
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
}

它输出no message received. 或者这个代码:

import (
"fmt"
"time"
)
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
go f("goroutine")
go func(msg string) {
fmt.Println(msg)
}("going")
time.Sleep(time.Second)
fmt.Println("done")
}

意外打印

going
goroutine : 0
goroutine : 1
goroutine : 2

尽管事实上,与going的goroutine比计数器晚。为什么?

多个 goroutines 之间没有执行顺序保证。只有当两个goroutine使用一个通道交换数据,或者使用另一个同步机制同步时,才能建立排序保证。在你的例子中,你碰巧观察到一个goroutine碰巧在另一个goroutine之前运行的执行。当您多次运行它时,您可能会观察到不同的顺序。

最新更新