婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解golang RWMutex讀寫互斥鎖源碼分析

詳解golang RWMutex讀寫互斥鎖源碼分析

熱門標簽:釘釘有地圖標注功能嗎 浙江高頻外呼系統多少錢一個月 建造者2地圖標注 汕頭小型外呼系統 鄭州亮點科技用的什么外呼系統 濱州自動電銷機器人排名 惠州電銷防封電話卡 黃岡人工智能電銷機器人哪個好 阿里云ai電話機器人

針對Golang 1.9的sync.RWMutex進行分析,與Golang 1.10基本一樣除了將panic改為了throw之外其他的都一樣。

RWMutex是讀寫互斥鎖。鎖可以由任意數量的讀取器或單個寫入器來保持。

RWMutex的零值是一個解鎖的互斥鎖。

以下代碼均去除race競態檢測代碼

源代碼位置:sync\rwmutex.go

結構體

type RWMutex struct {
  w      Mutex // 互斥鎖
  writerSem  uint32 // 寫鎖信號量
  readerSem  uint32 // 讀鎖信號量
  readerCount int32 // 讀鎖計數器
  readerWait int32 // 獲取寫鎖時需要等待的讀鎖釋放數量
}

常量

const rwmutexMaxReaders = 1  30  // 支持最多2^30個讀鎖

方法

Lock

提供寫鎖操作.

func (rw *RWMutex) Lock() {
  // 競態檢測
 if race.Enabled {
 _ = rw.w.state
 race.Disable()
 }
 // 使用Mutex鎖
 rw.w.Lock()
 // Announce to readers there is a pending writer.
 r := atomic.AddInt32(rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
 // Wait for active readers.
 if r != 0  atomic.AddInt32(rw.readerWait, r) != 0 {
 runtime_Semacquire(rw.writerSem)
 }
 // 競態檢測
 if race.Enabled {
 race.Enable()
 race.Acquire(unsafe.Pointer(rw.readerSem))
 race.Acquire(unsafe.Pointer(rw.writerSem))
 }
}

RLock

提供讀鎖操作,

func (rw *RWMutex) RLock() {
  // 競態檢測
 if race.Enabled {
 _ = rw.w.state
 race.Disable()
 }
 // 每次goroutine獲取讀鎖時,readerCount+1
  // 如果寫鎖已經被獲取,那么readerCount在-rwmutexMaxReaders與0之間,這時掛起獲取讀鎖的goroutine,
  // 如果寫鎖沒有被獲取,那么readerCount>0,獲取讀鎖,不阻塞
  // 通過readerCount判斷讀鎖與寫鎖互斥,如果有寫鎖存在就掛起goroutine,多個讀鎖可以并行
 if atomic.AddInt32(rw.readerCount, 1)  0 {
 // 將goroutine排到G隊列的后面,掛起goroutine
 runtime_Semacquire(rw.readerSem)
 }
 // 競態檢測
 if race.Enabled {
 race.Enable()
 race.Acquire(unsafe.Pointer(rw.readerSem))
 }
}

RLocker

可以看到RWMutex實現接口Locker.

type Locker interface {
 Lock()
 Unlock()
}

而方法RLocker就是將RWMutex轉換為Locker.

func (rw *RWMutex) RLocker() Locker {
 return (*rlocker)(rw)
}

總結

讀寫互斥鎖的實現比較有技巧性一些,需要幾點

  1. 讀鎖不能阻塞讀鎖,引入readerCount實現
  2. 讀鎖需要阻塞寫鎖,直到所以讀鎖都釋放,引入readerSem實現
  3. 寫鎖需要阻塞讀鎖,直到所以寫鎖都釋放,引入wirterSem實現
  4. 寫鎖需要阻塞寫鎖,引入Metux實現

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • GO語言并發編程之互斥鎖、讀寫鎖詳解
  • 詳解Golang互斥鎖內部實現
  • Go語言實現互斥鎖、隨機數、time、List

標簽:東營 昭通 駐馬店 泰安 阿壩 晉中 瀘州 滄州

巨人網絡通訊聲明:本文標題《詳解golang RWMutex讀寫互斥鎖源碼分析》,本文關鍵詞  詳解,golang,RWMutex,讀寫,互斥,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解golang RWMutex讀寫互斥鎖源碼分析》相關的同類信息!
  • 本頁收集關于詳解golang RWMutex讀寫互斥鎖源碼分析的相關信息資訊供網民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章
    主站蜘蛛池模板: 安泽县| 格尔木市| 兰州市| 仪征市| 乌什县| 龙海市| 油尖旺区| 灌南县| 乐山市| 永修县| 石柱| 方城县| 大埔区| 丹凤县| 陕西省| 禄丰县| 璧山县| 陵水| 彭阳县| 卓尼县| 马边| 青川县| 鄂托克旗| 咸宁市| 宁德市| 隆德县| 东方市| 彭山县| 舟山市| 浙江省| 宁陕县| 洛南县| 临清市| 西乌| 永平县| 烟台市| 探索| 山阳县| 鄂托克旗| 金溪县| 蒙自县|