《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
《零基础Go语言算法实战》
【题目 2-22】Go 调度器优先调度问题
下面代码的输出是什么?请说明原因。
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 5; i++ {
go func() {
fmt.Println("i: ", i)
wg.Done()
}()
}
for j := 0; j < 5; j++ {
go func(i int) {
fmt.Println("j: ", i)
wg.Done()
}(j)
}
wg.Wait()
}
【解答】
这个输出取决于调度器优先调度哪个 goroutine。从 runtime 的源码可以看到,当创建一
个 goroutine 时,会优先放入到下一个调度的 runnext 字段上作为下一次优先调度的 goroutine。
因此,最先输出的是最后创建的 goroutine,也就是 j: 4。完整输出如下:
j: 4
i: 5
i: 5
i: 5
i: 5
i: 5
j: 0
j: 1
j: 2
j: 3