Look for some code from the Go standard library for customization. For example, from go/src/sync/atomic/64bit_arm.go ,
func addUint64(val *uint64, delta uint64) (new uint64) { for { old := *val new = old + delta if CompareAndSwapUint64(val, old, new) { break } } return }
For float32 that becomes,
package main import ( "fmt" "math" "sync/atomic" "unsafe" ) func AddFloat32(val *float32, delta float32) (new float32) { for { old := *val new = old + delta if atomic.CompareAndSwapUint32( (*uint32)(unsafe.Pointer(val)), math.Float32bits(old), math.Float32bits(new), ) { break } } return } func main() { val, delta := float32(math.Pi), float32(math.E) fmt.Println(val, delta, val+delta) new := AddFloat32(&val, delta) fmt.Println(val, new) }
Conclusion:
3.1415927 2.7182817 5.8598747
5.8598747 5.8598747
source share