最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年06月13日 10:20:24   作者:夢朝思夕  
這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

源代碼位置:sync\rwmutex.go

結(jié)構(gòu)體

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轉(zhuǎn)換為Locker.

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

總結(jié)

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang timer可能造成的內(nèi)存泄漏問題分析

    Golang timer可能造成的內(nèi)存泄漏問題分析

    本文探討了Golang中timer可能造成的內(nèi)存泄漏問題,通過分析一段代碼,解釋了為什么協(xié)程在調(diào)用timer.Stop()后無法正常退出,文章指出,timer.Stop()并不關(guān)閉Channel,導(dǎo)致協(xié)程無法繼續(xù)執(zhí)行,最后,提出了一種修復(fù)方法,并呼吁大家關(guān)注和分享
    2024-12-12
  • Go語言sync包與鎖實現(xiàn)限制線程對變量的訪問

    Go語言sync包與鎖實現(xiàn)限制線程對變量的訪問

    本文主要介紹了Go語言sync包與鎖實現(xiàn)限制線程對變量的訪問,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • go中利用reflect實現(xiàn)json序列化的示例代碼

    go中利用reflect實現(xiàn)json序列化的示例代碼

    和Java語言一樣,Go也實現(xiàn)運行時反射,這為我們提供一種可以在運行時操作任意類型對象的能力,本文給大家介紹了在go中如何利用reflect實現(xiàn)json序列化,需要的朋友可以參考下
    2024-03-03
  • Golang函數(shù)式編程深入分析實例

    Golang函數(shù)式編程深入分析實例

    習(xí)慣與函數(shù)式編程語言的開發(fā)者,會認(rèn)為for循環(huán)和if判斷語句是冗長的代碼,通過使用map和filter處理集合元素讓代碼更可讀。本文介紹Go閉包實現(xiàn)集合轉(zhuǎn)換和過濾功能
    2023-01-01
  • Go語言中的方法、接口和嵌入類型詳解

    Go語言中的方法、接口和嵌入類型詳解

    這篇文章主要介紹了Go語言中的方法、接口和嵌入類型詳解,本文分別對它們做了詳細(xì)講解,需要的朋友可以參考下
    2014-10-10
  • Go語言變量的聲明實現(xiàn)示例

    Go語言變量的聲明實現(xiàn)示例

    本文主要介紹了Go語言變量的聲明實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • golang中使用匿名結(jié)構(gòu)體的方法

    golang中使用匿名結(jié)構(gòu)體的方法

    這篇文章主要介紹了golang中使用匿名結(jié)構(gòu)體,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 用Go+WebSocket快速實現(xiàn)一個chat服務(wù)

    用Go+WebSocket快速實現(xiàn)一個chat服務(wù)

    這篇文章主要介紹了用Go+WebSocket快速實現(xiàn)一個chat服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 利用Go語言追加內(nèi)容到文件末尾

    利用Go語言追加內(nèi)容到文件末尾

    關(guān)于Go語言讀寫文件,網(wǎng)上很多教程了,但是今天有個需求,想要把內(nèi)容追加寫到文件末尾,在網(wǎng)上找了很久才找到答案,現(xiàn)在分享給大家,有需要的可以參考借鑒。
    2016-09-09
  • golang gorm 結(jié)構(gòu)體的表字段缺省值設(shè)置方式

    golang gorm 結(jié)構(gòu)體的表字段缺省值設(shè)置方式

    這篇文章主要介紹了golang gorm 結(jié)構(gòu)體的表字段缺省值設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

温泉县| 天等县| 永仁县| 张家口市| 名山县| 沛县| 高安市| 连城县| 巴中市| 灵丘县| 酒泉市| 惠安县| 五寨县| 泸西县| 高密市| 枞阳县| 松阳县| 克什克腾旗| 祁连县| 元江| 紫金县| 海伦市| 南开区| 临高县| 铜陵市| 沾益县| 侯马市| 宁强县| 左贡县| 西乌珠穆沁旗| 天长市| 岳池县| 中西区| 门头沟区| 柳州市| 沙田区| 普洱| 苏州市| 嵊泗县| 郸城县| 渝中区|