国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

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

2020-04-01 18:56:57
字體:
來源:轉載
供稿:網(wǎng)友

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

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

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

以下代碼均去除race競態(tài)檢測代碼

源代碼位置:sync/rwmutex.go

結構體

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

常量

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

方法

Lock

提供寫鎖操作.

func (rw *RWMutex) Lock() {  // 競態(tài)檢測 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) } // 競態(tài)檢測 if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(&rw.readerSem)) race.Acquire(unsafe.Pointer(&rw.writerSem)) }}

RLock

提供讀鎖操作,

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

RLocker

可以看到RWMutex實現(xiàn)接口Locker.

type Locker interface { Lock() Unlock()}

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

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

總結

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁安市| 宿州市| 九寨沟县| 榆中县| 武宁县| 贵南县| 河间市| 大埔区| 柘城县| 东平县| 田阳县| 利津县| 贵德县| 镇赉县| 平陆县| 五指山市| 阿拉尔市| 贵溪市| 娄烦县| 治多县| 普兰县| 延川县| 饶平县| 土默特左旗| 安溪县| 封开县| 丹凤县| 广元市| 双柏县| 申扎县| 罗江县| 莱阳市| 图片| 札达县| 济宁市| 当雄县| 察雅县| 都匀市| 大新县| 虹口区| 铁力市|