互斥鎖與讀寫鎖使用

2021-08-11 11:15:09 字數 2497 閱讀 8333

sync.mutex和sync.rwmutex是go語言底層基礎物件,用於構建多個goroutine間的同步邏輯,當多個協程需要對共享資料讀寫時用到。具體實現極為簡潔,效能也***。
舉例:1.多個協程操作同乙個檔案 2.生產者消費者模型 

具體例項我就以最簡單的列印方式說明

互斥鎖

func print(t *testing.t, i int, wg *sync.waitgroup, mutex *sync.mutex)

func testsync(t *testing.t)

for i := 0

; i < 2; i++

wg.wait()

}這是go的測試用例,並沒有用main函式來執行,go的原始碼裡面很多都是以這種形式寫的測試用例。

這裡需要說明一下,go的協程需要達到真正的併發,需要加上runtime.gomaxprocs(runtime.numcpu()),

print函式裡面mutex.lock()注釋了,列印的結果是

sync_test.go:12: routine i=0 start!

sync_test.go:12: routine i=1 start!

sync_test.go:14: routine i=1 end!

sync_test.go:14: routine i=0 end!

協程0(暫且這麼稱呼)先執行print函式,但並沒有先結束,我們看到協程1是先結束的,這個程式就有併發安全性的問題。如果需要解決這個問題,達到誰先進入公共**區域,誰就先結束,只需要把print函式裡面互斥鎖lock()和unlock()開啟即可,會看到如下列印資訊。

sync_test.go:12: routine i=0 start!

sync_test.go:14: routine i=0 end!

sync_test.go:12: routine i=1 start!

sync_test.go:14: routine i=1 end!

讀寫鎖

驗證結論:如果乙個協程在讀,其他協程不可以寫,其他協程可以讀。如果乙個協程在寫,任何協程都不可以讀和寫

首先驗證多個讀

func testreadlock(t *testing.t)

func read(lock *sync.rwmutex, i int) else

println(i, "read end")

}列印資訊如下:

1read

start

2read

start

1 reading

2 reading

1read

end2

read

end我們可以看出,協程1在沒有read完之前,協程2還是可以讀的,即驗證了可以有多個讀

這次來驗證第二個結論,有乙個協程在讀,另個協程能不能寫呢?

func testwritelock(t *testing.t)

func read(lock *sync.rwmutex, i int) else

println(i, "read end")

}func write(lock *sync.rwmutex, i int)

列印如下:

2read

start

2 reading

3write

start

1write

start

4read

start

2read

end3 writing

3write

end4 reading

4read

end1 writing

1write

end我們看到,協程2號線進入讀,協程3號寫開始,但並沒有writing,而是等到協程2號read

end之後才開始writing,協程2號在讀的時候,協程4號開始讀,但由於協程3號是在協程2號之後進入write

start,所以協程2號read

end後是協程3號writing,直到結束,協程4號開始reading

接下來驗證最後乙個結論

我們把testwritelock函式裡面的write協程放到前面

func testwritelock(t *testing.t)

列印資訊如下:

1write

start

1 writing

4read

start

2read

start

3write

start

1write

end2 reading

4 reading

4read

end2

read

end3 writing

3write

end好了,我們已經驗證了我們最開始的結論,是不是很簡單。

互斥鎖機制,互斥鎖與讀寫鎖區別

互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...

互斥鎖和讀寫鎖

互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...

同步 互斥鎖 讀寫鎖 區別

相交程序之間的關係主要有兩種,同步與互斥。所謂互斥,是指散步在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它 們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。所謂同步,是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後...