日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang mutex互斥锁分析

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang mutex互斥锁分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

互斥鎖:沒有讀鎖寫鎖之分,同一時刻,只能有一個gorutine獲取一把鎖

數據結構設計:

type Mutex struct {state int32 // 將一個32位整數拆分為 當前阻塞的goroutine數(30位)|喚醒狀態(1位)|鎖狀態(1位) 的形式,來簡化字段設計sema uint32 // 信號量 }const (mutexLocked = 1 << iota // 0001 含義:用最后一位表示當前對象鎖的狀態,0-未鎖住 1-已鎖住mutexWoken // 0010 含義:用倒數第二位表示當前對象是否被喚醒 0-喚醒 1-未喚醒mutexWaiterShift = iota // 2 含義:從倒數第二位往前的bit位表示在排隊等待的goroutine數 )

關鍵函數設計:

lock函數:

//獲取鎖,如果鎖已經在使用,則會阻塞一直到鎖可用 func (m *Mutex) Lock() {// m.sate == 0時說明當前對象還沒有被鎖住過,進行原子操賦值作操作設置mutexLocked狀態,CompareAnSwapInt32返回true// m.sate != 1時剛好相反說明對象已被其他goroutine鎖住,不會進行原子賦值操作設置,CopareAndSwapInt32返回falseif atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) { if race.Enabled {race.Acquire(unsafe.Pointer(m))}return}awoke := falseiter := 0for {old := m.state // 保存對象當前鎖狀態new := old | mutexLocked // 保存對象即將被設置成的狀態if old&mutexLocked != 0 { // 判斷對象是否處于鎖定狀態if runtime_canSpin(iter) { // 判斷當前goroutine是否可以進入自旋鎖if !awoke && old&mutexWoken == 0 && old>>mutexWaiterShift != 0 &&atomic.CompareAndSwapInt32(&m.state, old, old|mutexWoken) {awoke = true}runtime_doSpin() // 進入自旋鎖后當前goroutine并不掛起,仍然在占用cpu資源,所以重試一定次數后,不會再進入自旋鎖邏輯iter++continue}// 更新阻塞goroutine的數量new = old + 1<<mutexWaiterShift //new = 2 }if awoke {if new&mutexWoken == 0 {panic("sync: inconsistent mutex state")}// 設置喚醒狀態位0new &^= mutexWoken}if atomic.CompareAndSwapInt32(&m.state, old, new) {if old&mutexLocked == 0 { // 如果對象原本不是鎖定狀態,對象已經獲取到了鎖break}// 如果對象原本就是鎖定狀態,掛起當前goroutine,進入休眠等待狀態runtime_Semacquire(&m.sema)awoke = trueiter = 0}}if race.Enabled {race.Acquire(unsafe.Pointer(m))} }

再來看看unlock函數,終于可以來點輕松的了

func (m *Mutex) Unlock() {if race.Enabled {_ = m.staterace.Release(unsafe.Pointer(m))}// 改變鎖的狀態值new := atomic.AddInt32(&m.state, -mutexLocked)if (new+mutexLocked)&mutexLocked == 0 { // 如果原來鎖不是鎖定狀態,報錯panic("sync: unlock of unlocked mutex")}old := newfor {// 1. 如果沒有阻塞的goroutine直接返回// 2. 如果已經被其他goroutine獲取到鎖了直接返回
// 需要說明的是為什么是old&(mutexLocked|mutexWoken)而不是old&mutexLocked
// 首先如果是old&mutexLocked的話,那鎖就沒法釋放了
// 最主要的一點是lock時進入自旋鎖邏輯后,goroutine持有的對象狀態會設置為mutexLocked|mutexWoken
// 這種情況讓再去解鎖后mutexWaiterShift數就會出現不一致情況
if old>>mutexWaiterShift == 0 || old&(mutexLocked|mutexWoken) != 0 {return}// 更新阻塞的goroutine個數new = (old - 1<<mutexWaiterShift) | mutexWokenif atomic.CompareAndSwapInt32(&m.state, old, new) {// 通知阻塞的goroutineruntime_Semrelease(&m.sema)return}old = m.state} }

?

總結:

一、互斥效果實現方式

  1. 當前goroutine進入自旋鎖邏輯等待中

  2. 掛起當前goroutine等待其他goroutine解鎖通知,通過信號量實現

二、鎖數據結構設計十分精簡

? ? ?goroutine數(30位)|喚醒狀態(1位)|鎖狀態(1位)

轉載于:https://www.cnblogs.com/zongjiang/p/6577297.html

總結

以上是生活随笔為你收集整理的golang mutex互斥锁分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费一级毛片麻豆精品 | 色婷婷中文字幕 | av免费网址在线观看 | youjizz中国少妇 | 免费人成视频在线播放 | 国产视频播放 | 天堂在线中文 | 人人射视频 | 91成人入口 | 日本国产在线观看 | 草莓巧克力香氛动漫的观看方法 | 大地资源中文在线观看免费版 | 欧美黄色网络 | 一本之道高清无码视频 | 麻豆成人久久精品一区二区三区 | 亚洲av无码乱码国产精品久久 | 久久视频一区二区三区 | a天堂视频在线观看 | 免费观看美女裸体网站 | 中日韩在线观看 | 久久大胆| 日本夜夜操 | 欧美人妻少妇一区二区三区 | 视频在线日韩 | 亚洲天堂av影院 | 婷婷777 | 亚洲欧美日韩综合在线 | 精品无人国产偷自产在线 | 日韩在线一二三 | 亚洲欧洲一级 | 一级黄色免费片 | 欧美成人a交片免费看 | 国产日韩三级 | av电影在线观看不卡 | 麻豆精品一区二区三区 | 欧美日韩电影一区 | 久久日本精品字幕区二区 | 欧美视频中文字幕 | 高跟鞋av | 一区二区三区福利 | 强行侵犯视频在线观看 | 日韩熟妇一区二区三区 | 亚洲一区电影网 | 四虎影库永久在线 | 天堂av最新网址 | 国语对白做受xxxxx在线中国 | 国产不卡精品视频 | 中文字幕自拍偷拍 | 国产精品宾馆在线精品酒店 | 在线小视频 | 亚洲一卡二卡三卡四卡 | 欧美性受xxxx黑人xyx性爽 | 91视频最新| 日韩精品在线免费观看视频 | 国产激情在线看 | 人妻激情文学 | 欧美在线高清 | 欧美视频一 | 公肉吊粗大爽色翁浪妇视频 | 欧美日本黄色 | 婷婷干| 一区二区三区视频免费 | 国产亚洲欧美精品久久久www | 国产99页| 被灌满精子的波多野结衣 | 天天舔天天射天天干 | 麻豆黄色片 | 日韩成人午夜 | 91综合色 | 成人午夜视频免费在线观看 | 国产高潮呻吟久久 | 在线的av| 欧美日韩国产一区二区在线观看 | 岛国av网站 | 激情小视频 | 少妇视频一区二区三区 | 又欲又污又肉又黄短文 | 久久视频在线观看 | 麻豆爱爱视频 | 日日爱网站 | 欧美成人免费一级人片100 | 久久av喷吹av高潮av萌白 | www.日本黄色| 男人天堂2014 | 欧美激情视频一区二区三区在线播放 | 国产综合视频在线观看 | 免费看成人aa片无码视频羞羞网 | 一级黄色片免费在线观看 | 无套在线观看 | 视频黄页在线观看 | 中文字幕+乱码+中文乱码91 | 国模少妇一区二区 | 成人在线亚洲 | 91传媒入口 | 欧美日韩国产三区 | 一级影片在线观看 | 午夜理伦三级做爰电影 | 91在线精品播放 | 午夜在线免费观看视频 |