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