我對下面的代碼感到困惑,與,會改變程序行為有什么區別嗎?go run go run -race-race// test.gopackage mainimport "fmt"func main() { c := make(chan string) go func() { for i := 0; i < 2; i++ { c <- "hello there" } }() for msg := range c { fmt.Println(msg) }}當 時,結果為:go run test.gohello therehello therefatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main() /Users/donghui6/go/src/jd.com/iaas-sre/test/test.go:14 +0xf4exit status 2當 時,程序將掛起,如下所示:go run -race test.gohello therehello there所以,誰能告訴我使用標志時發生了什么-race
1 回答

素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
在 Go Build 中使用 '-race' 標志時會發生什么
然后,在啟用所謂的“比賽檢測器”的情況下構建程序。數據競賽是一種編程錯誤,任何具有數據競賽的程序都是無效的,其行為是未定義的。切勿使用數據競跑編寫代碼。
數據競賽是指兩個或多個 goroutine 在沒有正確同步的情況下讀取和寫入同一內存。數據競賽時有發生,但這是程序員的一個主要錯誤。
競速檢測器檢測到對同一存儲器的未同步讀/寫,并將其報告為故障(確實如此)。請注意,如果 race 檢測器檢測到數據競跑,即使它在沒有 -race 的情況下“正?!边\行,您的代碼也是錯誤的。
競態檢測器并不總是打開,因為檢測數據競跑會大大減慢執行速度。
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消