2020-10-21:go中channel的send流程是什么?#福大大架構師每日一題#
uj5u.com熱心網友回復:
1.先獲取全域鎖;2.然后enqueue元素(通過移動拷貝的方式);
3.釋放鎖;
uj5u.com熱心網友回復:
先鎖住當前協程,然后依次判斷執行1 檢查channel.recvq是否有等待中的接收者的G?
1-1 有:立即把資料轉發給該接收者, 然后釋放鎖并退出
1-2 無:繼續2
2 檢查是否有可用的緩沖區?
2-1 有:把資料存入目標緩沖區等待被接收, 然后釋放鎖并退出。
2-2 無:繼續3
3 檢查是否阻塞?
3-1 非阻塞:放棄發送(丟棄資料), 然后釋放鎖并退出.
3-2 阻塞:新建一個sudog放入發送等待佇列channel.sendq,釋放鎖并把G狀態改為等待中(waiting)
3-2-1 發送成功后G被喚醒,然后釋放sudog并回傳
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/184796.html
標籤:Java相關
上一篇:對于資料結構大二猿很迷茫
下一篇:關于mq訊息丟失,沒有思路了。
