《零基礎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 執行。
?
?