gpt4 book ai didi

去 atomic.AddFloat32()

转载 作者:IT王子 更新时间:2023-10-29 01:20:20 24 4
gpt4 key购买 nike

我需要一个函数来在 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 中有更好/更快的方法吗?

最佳答案

从Go标准库中寻找一些代码进行适配。例如,来自 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
}

对于 float32 来说,

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)
}

输出:

3.1415927 2.7182817 5.85987475.8598747 5.8598747

关于去 atomic.AddFloat32(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27492349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com