《零基础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

相关推荐
非优秀程序员1 天前
题记|《互联网产品恩仇录》
后端·程序员·创业
非优秀程序员1 天前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
武子康1 天前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
易师傅1 天前
技术面试已死?AI 时代,真正拉开程序员差距的是什么?
前端·后端·程序员
Hilaku1 天前
你们公司有 35 岁以上的前端吗?
前端·javascript·程序员
AI前端工程狮1 天前
服务端已经死了,客户端却报"超时"
人工智能·程序员
楠风测开1 天前
两个任务同时跑,B 的登录态为什么被踢回登录页
程序员
codigger1 天前
大厂git提交规范
git·程序员
lisw051 天前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵