go源码的raceenable是做什么的,可否解答一二!

Zero
  • 14

golang raceenable

回复
阅读 3k
1 个回答

从名字上就能看出来了,表示是否启用数据竞争检测。

go 的 build 和 run 命令支持选项 -race。如果启用该选项,发现存在数据竞态就会报警。-race 在源码中对应的变量是 raceenabled,当启用 -race, raceenabled 就是 true。

你可以看看 map 的源码,位置在 src/runtime/map.go,在访问 map 时,有很多关于 raceenabled 是否启用的判断,比如 mapaccess1 函数。

if raceenabled && h != nil {
    callerpc := getcallerpc()
    pc := funcPC(mapaccess1)
    racereadpc(unsafe.Pointer(h), callerpc, pc)
    raceReadObjectPC(t.key, key, callerpc, pc)
}

关于 race 检测的一些函数是由汇编实现的,比如 x86_64 架构的相关函数在 race_amd64.s 文件中。

贴两个我写的和 race 相关的文章和回答。一篇官方的译文 Go 竞态检测器 和一篇关于竞态条件导致的 fatal error 的提问,回答地址

宣传栏