• Go竞争条件检测


    即使我们小心到不能再小心,但在并发程序中犯错还是太容易了。幸运的是,Go的runtime和工具链为我们装备了一个复杂但好用的动态分析工具,竞争检查器(the race detector)。

    只要在go buildgo run或者go test命令后面加上-race的flag,就会使编译器创建一个你的应用的“修改”版或者一个附带了能够记录所有运行期对共享变量访问工具的test,并且会记录下每一个读或者写共享变量的goroutine的身份信息。另外,修改版的程序会记录下所有的同步事件,比如go语句,channel操作,以及对(sync.Mutex).Lock,(sync.WaitGroup).Wait等等的调用。(完整的同步事件集合是在The Go Memory Model文档中有说明,该文档是和语言文档放在一起的。译注:https://golang.org/ref/mem)

    竞争检查器会检查这些事件,会寻找在哪一个goroutine中出现了这样的case,例如其读或者写了一个共享变量,这个共享变量是被另一个goroutine在没有进行干预同步操作便直接写入的。这种情况也就表明了是对一个共享变量的并发访问,即数据竞争。这个工具会打印一份报告,内容包含变量身份,读取和写入的goroutine中活跃的函数的调用栈。这些信息在定位问题时通常很有用。9.7节中会有一个竞争检查器的实战样例。

    竞争检查器会报告所有的已经发生的数据竞争。然而,它只能检测到运行时的竞争条件;并不能证明之后不会发生数据竞争。所以为了使结果尽量正确,请保证你的测试并发地覆盖到了你到包。

    由于需要额外的记录,因此构建时加了竞争检测的程序跑起来会慢一些,且需要更大的内存,即使是这样,这些代价对于很多生产环境的工作来说还是可以接受的。对于一些偶发的竞争条件来说,让竞争检查器来干活可以节省无数日夜的debugging。(译注:多少服务端C和C艹程序员为此竞折腰)

    Songzhibin
  • 相关阅读:
    从技术走向管理
    一位大龄程序员所经历的面试的历炼和思考
    从技术谈到管理,把系统优化的技术用到企业管理
    Xamarin.iOS 开发 1通过“与 Mac 配对”进行 Xamarin.iOS 开发
    net 开源工作流比较及应用
    net core体系-UWP
    net 架构-5 ABP框架的Web API调用类在Winform项目中的使用
    net 架构-4ABP框架的Web API调用类的封装和使用
    MVC后台的几种跳转方法
    sqlserver存储过程杀掉数据库中死锁
  • 原文地址:https://www.cnblogs.com/binHome/p/12600833.html
Copyright © 2020-2023  润新知