goroutine调用行之后的行是否比goroutine的第一行早开始?

问题描述 投票:0回答:1

下面是代码。

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 比柜台晚叫。为什么这么说呢?

go goroutine
1个回答
3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.