欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Golang: 对float64 类型的变量进行原子加法操作

Golang: 对float64 类型的变量进行原子加法操作

2025/9/16 22:48:14 来源:https://blog.csdn.net/qq_18668137/article/details/145470326  浏览:    关键词:Golang: 对float64 类型的变量进行原子加法操作
func AddFloat64(val *float64, delta float64) (new float64) {for {old := *valnew = old + deltaif atomic.CompareAndSwapUint64((*uint64)(unsafe.Pointer(val)),math.Float64bits(old),math.Float64bits(new),) {break}}return
}

这段 Go 语言的代码实现了一个并发安全的浮点数加法操作。它的功能是通过原子操作(atomic.CompareAndSwapUint64)来确保在多线程(或 Goroutine)环境下,对一个 float64 类型的变量进行加法操作时不会发生竞争条件(Race Condition)。

1. atomic.CompareAndSwapUint64

作用:尝试原子地更新 val 的值

将 val 的指针转换为 *uint64 类型(因为 CompareAndSwapUint64 操作的是 uint64

使用 math.Float64bits 将 old 和 new 转换为 uint64 类型的二进制表示,如果 val 的当前值仍然是 old 的二进制表示,则将其更新为 new 的二进制表示,并返回 true,此时循环结束。

如果 val 的值已经被其他 Goroutine 修改(即不再是 old),则 CompareAndSwapUint64 返回 false,循环继续,重新尝试更新。

2. 代码的关键点:

  • 并发安全

    • 通过 atomic.CompareAndSwapUint64 实现原子操作,确保在多线程环境下对 val 的修改是线程安全的。

  • 忙等待(Busy Waiting)

    • 如果 CompareAndSwapUint64 失败(即 val 的值被其他 Goroutine 修改),代码会不断重试,直到成功为止。

  • 浮点数的原子操作

    • Go 语言的 atomic 包没有直接支持 float64 的原子操作,因此代码通过将 float64 转换为 uint64 来实现原子操作。

示例

var total float64 = 0.0
AddFloat64(&total, 1.5) // 将 total 原子地增加 1.5
fmt.Println(total)      // 输出 1.5

总结:

这段代码实现了一个并发安全的浮点数加法操作,通过原子操作确保在高并发环境下对 float64 类型变量的修改是线程安全的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词