假设我有一段代码,该代码在布尔值上存在竞争条件,该布尔值只能从 true 变为 false。例如这样的事情:
ok := true
for {
go func() {
if !ok {
return
}
if !doSomething() {
ok = false
}
}()
}
我们这里有一个竞争条件,其中 ok 被分配给 false,但原则上我们不关心 which goroutine 首先更改变量,因为任何一个都会有相同的效果。我们也不关心某些 goroutine 在写入 false 时是否读取 true 值,因为在任何一种情况下程序都不会出现意外行为。
所以原则上根据我的推理,这应该没问题,但我记得总是读到所有数据争用都应该得到解决。这是一个一般规则(例如,它会导致未定义的行为),还是有时可以接受?
除非您考虑损坏的代码和程序员错误“好吧”。