知识卡片

竞态难以复现

专业/工作 · 489.b.2.b.1.a.1.c.1.b.1.a.2

内容

竞态来自多个 goroutine 对共享数据的时序不确定,坏处是错误不稳定、难复现。处理它不能靠“多跑几次没问题”,而要用同步原语、channel 设计或竞态检测器固定访问顺序。常用的同步原语之一就是 [[读写锁偏读多]]。

参考来源

- 位置:《Go语言高级开发与实战》第4章《Go语言并发编程》(源文件:_epub-src/GoYu Yan Gao Ji Kai Fa Yu Shi Zhan_split_038.html) - 结论依据:原文指出并发可能发生数据争用竞态,且不知道何时发生、难以发现和调试,因此支撑竞态难复现。 - 原始内容:性能优异而闻名。但是,伴随着并发的使用,可能发生可怕的数据争用竞态问题。而一旦遇到竞态问题,由于其不知道什么时候发生,这将是难以发现和调试的一种错误。 下面是一个发生数据竞态的示例,代码如下。 在上面的示例中,getNum()函数先声明一个变量i,之后在goroutine中单独对i进行设置。而这时程序也正在从函数中返回i,由于不知道goroutine是否已完成对i值的修改,因此,将会有以下两种操作发