讀draveness關於chan的介紹後的總結及疑問

Iwanna發表於2020-10-13

draveness關於chan的介紹後的總結及疑問

  1. chan 實現了go提出的通過通訊來共享記憶體的效果

  2. chan實質上可以理解為用於通訊和同步的加鎖的佇列

    無緩衝區時則為同步

  3. chan 阻塞的接收及傳送佇列

    1. recvq 是阻塞的接收方佇列,即x = <-ch,當ch裡面沒有資料給x了,就會把x記錄在recvq裡面等待資料
    2. sendq 是阻塞了的傳送佇列,即ch <- i,當ch的緩衝區滿了,就會把資料先放到sendq裡面去,等到緩衝區裡面被消費了一條就從sendq裡面拷貝一條到緩衝區去,然後釋放被拷貝的goroutine
    3. 如果存在阻塞的接收者傳送資料是不會先存到緩衝區,再讀取的,而是直接將值拷貝給x = <-ch中的x對應的地址
    4. 所以 recvq和sendq至多有一個裡面有內容?
  4. 對於帶緩衝區和不帶緩衝區的chan,go的處理是不一樣的

    有緩衝區的每次都會先讀取或者寫入的緩衝區

  5. chan關閉後,緩衝區中的資料還能被讀取的
    但是如果sendq裡面有阻塞的goroutine時去讀已經關閉的ch
    會觸發將sendq裡的內容寫入緩衝區的操作,此處會報錯(但是不知道為什麼,報錯機率大概只有80%)

  6. chan的緩衝區

    1. chan的緩衝區是環形的,即傳送角標(sendx )或者寫入角標(recvx )到了等於緩衝區長度(dataqsiz)後會跳轉到頭部(角標變為0)
    2. 當傳送角標==寫入角標時證明已經消費完了
    3. 當緩衝區的元素個數(qcount )==緩衝區可容納元素個數(dataqsiz )時證明緩衝區就滿了
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章