go競爭條件檢測

2021-10-07 05:32:00 字數 1033 閱讀 6745

資料競爭是併發情況下,存在多執行緒/協程讀寫相同資料的情況,必須存在至少一方。另外,全是讀的情況下是不存在資料競爭的。

go的runtime和工具鏈為我們裝備了乙個複雜但好用的動態分析工具,競爭檢查器(the race detector)。

只要在go build,go run或者go test命令後面加上-race的flag,就會使編譯器建立乙個你的應用的「修改」版或者乙個附帶了能夠記錄所有執行期對共享變數訪問工具的test,並且會記錄下每乙個讀或者寫共享變數的goroutine的身份資訊。另外,修改版的程式會記錄下所有的同步事件,比如go語句,channel操作,以及對(sync.mutex).lock,(sync.waitgroup).wait等等的呼叫。(完整的同步事件集合是在the go memory model文件中有說明,該文件是和語言文件放在一起的。譯註:

競爭檢查器會檢查這些事件,會尋找在哪乙個goroutine**現了這樣的case,例如其讀或者寫了乙個共享變數,這個共享變數是被另乙個goroutine在沒有進行干預同步操作便直接寫入的。這種情況也就表明了是對乙個共享變數的併發訪問,即資料競爭。這個工具會列印乙份報告,內容包含變數身份,讀取和寫入的goroutine中活躍的函式的呼叫棧。這些資訊在定位問題時通常很有用。9.7節中會有乙個競爭檢查器的實戰樣例。

競爭檢查器會報告所有的已經發生的資料競爭。然而,它只能檢測到執行時的競爭條件;並不能證明之後不會發生資料競爭。所以為了使結果盡量正確,請保證你的測試併發地覆蓋到了你到包。

由於需要額外的記錄,因此構建時加了競爭檢測的程式跑起來會慢一些,且需要更大的記憶體,即使是這樣,這些代價對於很多生產環境的工作來說還是可以接受的。對於一些偶發的競爭條件來說,讓競爭檢查器來幹活可以節省無數日夜的debugging。(譯註:多少服務端c和c++程式設計師為此競折腰)

日常 Go語言聖經 競爭條件習題

package main import fmt sync var balance int func deposit amount int func balance int 問題 1.在alice執行期間 balance balance amount 這一步運算可能會被bob中間擠占 2.當執行到ba...

日常 Go語言聖經 競爭條件習題

package main import fmt sync var balance int func deposit amount int func balance int 問題 1.在alice執行期間 balance balance amount 這一步運算可能會被bob中間擠占 2.當執行到ba...

日常 Go語言聖經 競爭條件習題

package main import fmt sync var balance int func deposit amount int func balance int 問題 1.在alice執行期間 balance balance amount 這一步運算可能會被bob中間擠占 2.當執行到ba...