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