简介
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 在同时进行读写,所以,警告信息可能会很长。