我需要一个函数来在 Go 中原子地添加 float32 值。这是基于我发现的一些 C 代码提出的:
package atomic
import (
"sync/atomic"
"unsafe"
"math"
)
func AddFloat32(addr *float32, delta float32) (new float32) {
unsafeAddr := (*uint32)(unsafe.Pointer(addr))
for {
oldValue := math.Float32bits(*addr)
new = *addr + delta
newValue := math.Float32bits(new)
if atomic.CompareAndSwapUint32(unsafeAddr, oldValue, newValue) {
return
}
}
}
它应该工作(即真的是原子的)吗?在 Go 中有更好/更快的方法吗?
相关分类