2020-10-24:go中channel的recv流程是什么?#福大大架構師每日一題#
uj5u.com熱心網友回復:
首先鎖住當前協程, 然后按以下順序判斷執行1 檢查channel是否已關閉并且沒有緩沖資料
1-1 是,則接收者接收零值, 然后釋放鎖并退出
1-2 否,繼續2
2 檢查發送佇列是否有發送者
2-1 有,則立即接收該資料, 然后釋放鎖并退出.
2-2 無,繼續3
3 檢查是否可從緩沖區取資料
3-1 是,從緩沖區取出資料復制給接收者, 然后釋放鎖并退出
3-2 否,繼續4
4 檢查是否阻塞
4-1 非阻塞,則不讀取資料, 然后釋放鎖并退出
4-2 阻塞,則新建一個sudog放入接收等待佇列channel.recvq,并把接收G改成等待狀態,然后釋放鎖并退出
4-2-1 接收成功后G被喚醒,然后釋放sudog并回傳
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189577.html
標籤:Java相關
