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

《零基础Go语言算法实战》【题目 2-25】goroutine 的执行权问题

《零基础Go语言算法实战》

【题目 2-25】goroutine 的执行权问题

请说明以下这段代码为什么会卡死。

package main

import (

 "fmt"

 "runtime"

)

func main() {

 var i byte

 go func() {

 for i = 0; i <= 255; i++ {

 }

 }()

 fmt.Println("start")

 // 让出执行以强制执行其他 goroutine

 runtime.Gosched()

 runtime.GC()

 fmt.Println("end")

}

【解答】

Go 语言中,byte 是 uint8 的别名。所以上面的 for 循环会始终成立,因为 i++ 执行到

i=255 时会溢出,所以 i <= 255 一定成立。也就是说,for 循环永远无法退出,所以上面的代

码其实可以等价于如下代码:

go func() {

 for {}

}

正在被执行的 goroutine 发生如 IO 操作、chanrel 阻塞、system call、运行较长时间等情况时,

让出当前 goroutine 的执行权,并调度后面的 goroutine 执行。

d86541ad958c4d02ad2666cbc5e9a3c3.png

 

 


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

相关文章:

  • 小结:华为路由器常用的操作指令
  • 《CPython Internals》阅读笔记:p118-p150
  • 基于springboot的疫情网课管理系统
  • 信息安全、网络安全和数据安全的区别和联系
  • java项目之在线文档管理系统源码(springboot+mysql+vue+文档)
  • Windows配置wsl和docker开发环境
  • 全网首发:嵌入式交叉编译libssh,正确编译脚本
  • LLM进化下的Agent演变及软件重构下的一点思考
  • Golang学习笔记_22——Reader示例
  • java项目之在线文档管理系统源码(springboot+mysql+vue+文档)
  • 从光子到图像——相机如何捕获世界?
  • 53_多级缓存基础环境搭建
  • doris:数据类型
  • win10电脑 定时关机
  • 5、波分复用 WDM
  • java项目之房屋租赁系统源码(springboot+mysql+vue)
  • 如何在后端使用redis进行缓存,任意一种语言都可以
  • nginx-lua模块安装
  • 【算法】判断一个链表是否为回文结构
  • gcc编译过程中-L和-rpath的作用
  • 农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)
  • 【电路设计】STM32硬件最小系统,Linux硬件最小系统,FPGA硬件最小系统
  • 接上篇基于Alertmanager 配置钉钉告警
  • 了解 Ansys Mechanical 中的网格方法:综合指南
  • Linux系统编程之线程优先级
  • LeetCode1170 比较字符串最小字母出现频次