Go 語言編程 — 併發 — 同步原語與鎖

目錄

文章目錄

協程鎖

協程鎖主要用於保證在執行 goroutine 的時候不阻塞 M。併發

舉例:任務 A 須要修改 Z,任務 B 也須要修改 Z。若是是串行系統,A 執行完了,再執行B,很簡單。在併發系統中,由於 A,B 是併發執行的,因此就須要在操做 Z 的時候確保 A、B 保證串行化的機制。spa

CO_LOCK
{
    // 處理邏輯
}
CO_UNLOCK

在這裏插入圖片描述

  1. A 要修改 Z,因此 A 加了協程鎖。
  2. 加鎖以後,因爲處理一些其餘的邏輯,例如等待某些事件,又把 CPU 切到 M.g0 調度了(yield),而且此時沒有放鎖。
  3. 這時 M 把 B 拿過來執行,yield to B。
  4. B 也要修改 Z,但此時發現 A 已經對 Z 加鎖了,因而 B 把本身掛到鎖結構裏面去。
  5. 而後 B 直接切走,yield to M.g0。
  6. 如今 A 的事件到達,M.g0 從新調度到 A 執行,yield to A。
  7. A 從剛剛切走的地方開始執行,完成後放鎖。注意,A 方鎖時,就會把 B 從鎖隊列中摘除,從新加到 M 的調度隊列中。
  8. A 方鎖後,M.g0 調度 B 執行。
  9. B 從剛剛加鎖的地方喚醒,而後對 Z 加鎖。而後走鎖內邏輯後,放鎖。

以上就是協程鎖的實現原理。保證 A、B 在修改 Z 的時候必須串行化。code

相關文章
相關標籤/搜索