Golang Data race 檢測

  1. golang中的 go 關鍵字可以很方便的開啓一個協程, 在函數中又非常容易隱藏 go這個關鍵字; 所以當程序龐大時, 有時會不知道一個變量被幾個協程所引用, 是否會引起多個協程競爭。
  2. golang在1.1之後引入了競爭檢測機制, 可以使用 go run -race 或者 go build -race來進行靜態檢測。
    • 其在內部的實現大概就是: 開啓多個協程執行同一個命令, 並且記錄下每個變量的狀態。
  3. 示例程序:

    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行產生的。

發佈了76 篇原創文章 · 獲贊 23 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章