知识卡片

数据争用是错

普通读书笔记卡 · 1484

内容

两个协程并发访问同一变量,至少一个写且没有同步,就是数据争用。即使偶尔结果正确,也已经破坏内存模型前提;race 工具用于发现这类时间相关错误。

参考来源

- 位置:《Go语言底层原理剖析》第17章《并发控制》17.3.1节《什么是数据争用》 - 结论依据:原文定义"数据争用(data race)在Go语言中指两个协程同时访问相同的内存空间,并且至少有一个写操作的情况",并用 count++ 的例子说明该操作在CPU层面拆成"读取-加1-写回"三步,两个协程并发执行时结果不可预测,因此可以推出"数据争用是并发访问同一内存且至少一个写、缺乏同步"的结论。 - 原始内容:数据争用(data race)在Go语言中指两个协程同时访问相同的内存空间,并且至少有一个写操作的情况。这种情况常常是并发错误的根源,也是最难调试的并发错误之一……count++操作看起来是一条指令,但是对CPU来说,需要先读取count的值,执行+1操作,再将count的值写回内存……当两个协程发生数据争用时,结果是不可预测的,这会导致很多奇怪的错误。