自学内容网 自学内容网

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

 

 


原文地址:https://blog.csdn.net/qq_39728668/article/details/145122772

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!