说我有两个例程:
var sequence int64
// writer
for i := sequence; i < max; i++ {
doSomethingWithSequence(i)
sequence = i
}
// reader
for {
doSomeOtherThingWithSequence(sequence)
}
那么如果没有atomic
,我能渡过难关吗?
我能想到的一些潜在风险:
重新排序(对于作者来说,更新sequence
发生在doSomething
之前),但我可以接受。
sequence
在内存中未正确对齐,因此读者可能会看到部分更新的i
。在具有x86_64的(最新内核)Linux上运行,
我们可以排除吗?
go编译器“巧妙地”优化了读取器,因此对i
的访问永远不会进入内存,而是cached
会进入寄存器。可以吗?
还有什么?
答案 0 :(得分:0)
Go的座右铭:Do not communicate by sharing memory; instead, share memory by communicating。大多数情况下,这是一种有效的最佳实践。
幸运的是,Go集成了data race detector。尝试使用go run -race
运行示例。您可能会看到sequence
变量上发生竞争情况。