- golang中的 go 關鍵字可以很方便的開啓一個協程, 在函數中又非常容易隱藏 go這個關鍵字; 所以當程序龐大時, 有時會不知道一個變量被幾個協程所引用, 是否會引起多個協程競爭。
- golang在1.1之後引入了競爭檢測機制, 可以使用 go run -race 或者 go build -race來進行靜態檢測。
- 其在內部的實現大概就是: 開啓多個協程執行同一個命令, 並且記錄下每個變量的狀態。
示例程序:
package main import "fmt" func main(){ a := 1 go func() { a = 2 }() a = 3 fmt.Println("a : ", a) }
- 協程 go func() 和主 goroutine 都對a進行了修改;當go run test_sum.go
- 輸出結果: a : 3
- 如果使用race來檢測上面的程序, 我們可以看到
$ go run -race test_sum.go a : 3 WARNING: DATA RACE Write at 0x00c0420441d0 by goroutine 6: main.main.func1() F:/Go/src/test01/test_sum.go:10 +0x42 Previous write at 0x00c0420441d0 by main goroutine: main.main() F:/Go/src/test01/test_sum.go:12 +0xa6 Goroutine 6 (running) created at: main.main() F:/Go/src/test01/test_sum.go:11 +0x95 Found 1 data race(s) exit status 66
這個warning, 告訴我們10 行 12 行產生了競態, 並且goroutine6是在第11行產生的。
Golang Data race 檢測
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.