1 回答

TA貢獻1876條經驗 獲得超7個贊
所以我花了一些時間研究這個主題,現在可以嘗試回答我自己的問題。整個 goroutine 生命周期變得更加復雜:
新的 goroutine 在一個名為 的特殊 goroutine 中創建
g0
,它是線程的主 goroutine。任何對 的調用都會go func
將堆棧從調用它的當前 Goroutine 更改為g0
(這是在 中完成的proc.go:newproc
)。當創建 goroutine 時(在 中),它的堆棧(和/或程序計數器,PC)以看起來像是由函數調用的
proc.go:newproc1
方式構建。這樣做是為了保證當 goroutine 完成并返回時,它會返回到.goexit
goexit
當
schedule
調用 并選擇運行一個 goroutine 時,該execute
函數將執行它(== 通過gogo
匯編函數跳轉到其地址)。Goroutine 完成后,它返回到
goexit
在匯編中實現的函數。該匯編函數調用
proc.go:goexit1
(不確定為什么需要匯編中的這個額外步驟)。該
goexit1
函數將當前堆棧更改為g0
. 這是通過調用mcall
(“機器線程調用”)來完成的,它執行參數中接收到的任何函數。在這種情況下,提供給的函數mcall
是goexit0
。在匯編中實現的 跳轉到的堆棧幀 (SP)
mcall
的地址并執行to 。g0
CALL
goexit0
該
goexit0
函數在 的上下文中執行g0
。它將一個已完成的 goroutine 放入空閑 goroutine 列表中,并釋放其堆棧(如果之前已增加)。然后再次
goexit0
調用schedule
,選擇一個 goroutine 來運行,所以我們回到步驟 3。
所以這里確實似乎沒有遞歸。調度的 goroutine 本身從不調用schedule
:這是由一個特殊的 goroutine 完成的g0
。我仍然不確定我是否捕獲了所有細節,因此歡迎評論和其他答案。
- 1 回答
- 0 關注
- 122 瀏覽
添加回答
舉報