В последнее время я обнаружил, что некоторый код выглядит следующим образом:
var m map[int]int
func writem() {
tmpm := make(map[int]int)
for i := 0; i < 4000000; i++ {
tmpm[i] = i + 10
}
m = tmpm
}
func readm() {
for k, v := range m {
_, _ = k, v
}
}
func main() {
writem()
go readm()
writem()
}
Эта программа работает нормально, но я думаю, что тело функции writem
можно изменить, переместив m = tmpm
перед циклом for, потому чтоэто не меняет поведение внутри этой программы.И это изменение порядка вызовет проблему concurrent map read and map write
.Как говорит Go Memory Model :
компиляторы и процессоры могут переупорядочивать операции чтения и записи, выполненные в одной процедуре, только в том случае, если переупорядочение не изменяет поведение в этой программе, как определеносогласно спецификации языка
Любое, я прав, или можно написать такой код безопасно?