Go race detector

65 阅读2分钟

简介

Go race detector 是基于 Google 的 C/C++ sanitizers 技术实现的,编译器通过探测所

有的内存访问,加入代码能监视对这些内存地址的访问(读还是写)。在代码运行的时候,

race detector 就能监控到对共享变量的非同步访问,出现 race 的时候,就会打印出警告信

息。

使用

go代码

package main

import (
    "fmt"
    "sync"
)

func main() {
    var count = 0
    var wg sync.WaitGroup
    wg.Add(10)
    for i := 0; i < 10; i++ {
       go func() {
          defer wg.Done()
          for j := 0; j < 100000; j++ {
             count++
          }
       }()
    }
    wg.Wait()
    fmt.Println(count)
}

测试上面代码

执行go run -race main.go 就会输出警告信息

~/GolandProjects/awesomeProject4 ❯ go run -race main.go                                                                                                                          12:22:47
==================
WARNING: DATA RACE
Read at 0x00c000116018 by goroutine 8:
  main.main.func1()
      /home/xxx/GolandProjects/awesomeProject4/main.go:16 +0x99

Previous write at 0x00c000116018 by goroutine 7:
  main.main.func1()
      /home/xxx/GolandProjects/awesomeProject4/main.go:16 +0xab

Goroutine 8 (running) created at:
  main.main()
      /home/xxx/GolandProjects/awesomeProject4/main.go:13 +0x84

Goroutine 7 (running) created at:
  main.main()
      /home/xxx/GolandProjects/awesomeProject4/main.go:13 +0x84
==================
==================
WARNING: DATA RACE
Write at 0x00c000116018 by goroutine 8:
  main.main.func1()
      /home/xxx/GolandProjects/awesomeProject4/main.go:16 +0xab

Previous write at 0x00c000116018 by goroutine 7:
  main.main.func1()
      /home/xxx/GolandProjects/awesomeProject4/main.go:16 +0xab

Goroutine 8 (running) created at:
  main.main()
      /home/xxx/GolandProjects/awesomeProject4/main.go:13 +0x84

Goroutine 7 (running) created at:
  main.main()
      /home/xxx/GolandProjects/awesomeProject4/main.go:13 +0x84
==================
793947
Found 2 data race(s)
exit status 66

例子中的 goroutine 8 对内存地址 0x00c000116018 有读的操作(main.go 文件第 16 行),同时,goroutine 7 对内存地址 0x00c000116018 有写的操作(main.go 文件第 16 行)。而且还可能有多个 goroutine 在同时进行读写,所以,警告信息可能会很长。