Я знаю, что может случиться так, что g печатает 2, а затем 0, учитывая следующий код.Выполняют ли атомарные операции в голанге связь между событиями?
var a, b uint32
func f() {
a = 1
b = 2
}
func g() {
fmt.Println(b)
fmt.Println(a)
}
func main() {
go f()
g()
}
Что делать, если я изменяю все операции чтения и записи на атомные операции? Гарантируется ли это, что если g сначала печатает 2, тогда также печатается 1?
var a, b uint32
func f() {
atomic.StoreUint32(&a, 1)
atomic.StoreUint32(&b, 2)
}
func g() {
fmt.Println(atomic.LoadUint32(&b))
fmt.Println(atomic.LoadUint32(&a))
}
func main() {
go f()
g()
}
Вы попробовали? В большинстве случаев 'f()' не будет выполняться вообще. – JimB