当前位置: 首页 > article >正文

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

700d73538aff4dd1885cc38bddc298ec.png

 

 


http://www.kler.cn/a/503076.html

相关文章:

  • 分布式缓存redis
  • rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库
  • 【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式
  • Bash语言的多线程编程
  • Bash语言的语法糖
  • 信息系统项目管理-采购管理-采购清单示例
  • 【Git】提交规范
  • 一个简单的html5导航页面
  • maven 项目怎么指定打包后名字
  • Http 响应状态码 前后端联调
  • 盲盒摆摊交友系统架构与功能分析
  • 网络学习记录6
  • opencv的NLM去噪算法
  • flask_sqlalchemy relationship 子表排序
  • 【实现案例】应用层面基于 MyBatis-Plus 实现数据表记录创建和修改时间自动同步
  • java项目之网上点餐系统源码(springboot+mysql+vue)
  • Git 的引用规格(refspec)语法
  • 调用Kimi的API接口使用,对话,json化,产品化
  • 3D扫描建模有哪些优势和劣势?
  • 开发指南090-使用python做微服务
  • centos systemd方式配置jar开机自启
  • 数据结构:栈(Stack)和队列(Queue)—面试题(二)
  • ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器
  • 力扣264. 丑数 II
  • 后端接口获取的对象包含图片,渲染后端图片,拼接地址渲染,循环列表,vue+uniapp
  • Visual Studio Code (VSCode)为当前项目设置保存时自动格式化