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

Zero
  • 14

golang raceenable

回复
阅读 3.6k
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 的提问,回答地址

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏