真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang中怎么利用RWMutex讀寫互斥鎖

這篇文章將為大家詳細講解有關(guān)golang中怎么利用RWMutex讀寫互斥鎖,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計,寧蒗網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寧蒗等地區(qū)。寧蒗做網(wǎng)站價格咨詢:18982081108

結(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)
}

關(guān)于golang中怎么利用RWMutex讀寫互斥鎖就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享名稱:golang中怎么利用RWMutex讀寫互斥鎖
文章鏈接:http://weahome.cn/article/jecghj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部