关于go的sync.WaitGroup里的goroutine的执行顺序的疑惑,请大神指点,谢谢!

简要代码如下:

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    wg.Add(2)
    go fun1()
    go fun2()
    fmt.Println("main进入阻塞状态,等待wg中的子goroutine结束。")
    wg.Wait()
    fmt.Println("main 解除阻塞")
}

func fun1() {
    for i := 1; i <= 20; i++ {
        fmt.Println("fun1 i:", i)
    }
    wg.Done()
}

func fun2() {
    //defer wg.Done()
    for j := 1; j <= 20; j++ {
        fmt.Println("\tfun2 j:", j)
    }
    wg.Done()
}

本人是 go 新手,这是在按网上的教程写的测试示例,我有点疑惑的是这段代码执行后为什么一直是先输出 fun2 方法里的内容,偶尔也会加载着 fun1 方法里的内容,这个大致能理解,但是不解的是为什么不会先输出 fun1 方法里的内容呢?

讨论数量: 10

因为go fun1()这里的go就是让fun1()并发执行的,既然是并发执行,那就是这样的

就比如你有两块A和B地要耕,你先叫了张三去耕A,一分钟后叫李四去耕B,那哪个最先到地里面(开始),哪个最先耕完(结束),都是未知的

2年前 评论
0512xiaohacker (楼主) 2年前
renxiaotu (作者) 2年前
renxiaotu (作者) 2年前
renxiaotu (作者) 2年前

本来就是乱序吧~

2年前 评论

并发就是无序的,这才正常,先fun1再fun2不又成阻塞了嘛

2年前 评论

协程,并发执行的呀

2年前 评论

没遇到先输出 func1 的原因是你 run 的次数太少, 还有个概率(运气)问题, 代码没毛病, go runtime 执行

2年前 评论

这个跟 GMP 模型有关了,可以看看这个 Goroutine 是怎么被分配到 P 上执行的。应该会有点帮助。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!