Go語言併發程式設計 讀寫鎖

2021-10-04 11:07:26 字數 2106 閱讀 6244

通過對互斥鎖的學習,我們已經了解了鎖的概念及用途。主要用於處理併發中的臨界資源問題。

rwmutex是基於mutex實現的,唯讀鎖的實現使用類似引用計數器的功能。

rwmutext是讀/寫互斥鎖。鎖可以由任意數量的讀取器或單個編寫器持有。rwmutex的零值是未鎖定的mutex。

當有乙個goroutine獲得寫鎖定,其他無論是讀鎖定還是寫鎖定都將阻塞知道寫解鎖;

當有乙個goroutine獲得讀鎖定,其他讀鎖定仍然可以繼續;當有乙個或任意多個讀鎖定,寫鎖定將等待所有讀鎖定解鎖之後才能進行寫鎖定。因此可以總結為:

同時只能有乙個goroutine能夠獲得寫鎖定。

同時可以有多個goroutine能夠獲得讀鎖定。

同時只能存在寫鎖定或者讀鎖定(讀寫互斥)

rwmutex的方法

方法名功能

(*rwmutext)lock()

寫鎖定(*rwmutex)unlock()

寫解鎖(*rwmutex)rlock()

讀鎖定(*rwmutex)runlock()

讀解鎖下面**實現了乙個讀鎖定的例項:

package main

import

("fmt"

"sync"

"time"

)var rwmutex *sync.rwmutex

var wg *sync.waitgroup

func

main()

func

readdata

(i int

)

控制台輸出

2 開始讀:read start..

2 正在讀取資料:reading..

1 開始讀:read start..

1 正在讀取資料:reading..

2 讀結束:read over..

1 讀結束:read over..

或者

2 開始讀:read start..

1 開始讀:read start..

1 正在讀取資料:reading..

2 正在讀取資料:reading..

1 讀結束:read over..

2 讀結束:read over..

main over..

下面**實現了讀寫鎖的應用示例:

package main

import

("fmt"

"sync"

"time"

)var rwmutex *sync.rwmutex

var wg *sync.waitgroup

func

main()

func

writedata

(i int

)func

readdata

(i int

)

控制台輸出,關鍵的互斥點在」正在讀取資料正在寫上「,讀者可以自行改變**多次執行體會:

3 開始讀:read start..

1 開始讀:read start..

1 正在讀取資料:reading..

3 正在讀取資料:reading..

2 開始寫:write start..

3 讀結束:read over..

2 正在寫:writing..

1 讀結束:read over..

2 寫結束:write over..

main over..

或者…:

3 開始讀:read start..

3 正在讀取資料:reading..

1 開始讀:read start..

1 正在讀取資料:reading..

2 開始寫:write start..

3 讀結束:read over..

2 正在寫:writing..

1 讀結束:read over..

2 寫結束:write over..

Go 語言程式設計 併發 同步原語與鎖

協程鎖主要用於保證在執行 goroutine 的時候不阻塞 m。舉例 任務 a 需要修改 z,任務 b 也需要修改 z。如果是序列系統,a 執行完了,再執行b,很簡單。在併發系統中,因為 a,b 是併發執行的,所以就需要在操作 z 的時候確保 a b 保證序列化的機制。a 要修改 z,所以 a 加了...

go語言併發程式設計

協程 coroutine 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現中寄存於執行緒中,系統開銷極小。package main import fmt func count ch chan int,i int func main for ch range chs chan...

Go語言併發程式設計(二)

使用非常簡單,在函式前增加乙個go 例 go f a,b 開啟後,不等待其結束,主線程繼續執行。ps 要注意的是乙個goroutine開啟後,若不等其執行,main 主goroutine 中將繼續執行下一步,那麼主線程一結束,goroutine中的程式就不會執行了。如何解決?如下 func says...