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