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

embedded/2025/2/7 22:02:48/
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 类型变量的修改是线程安全的。


http://www.ppmy.cn/embedded/160396.html

相关文章

AWS Copilot

AWS Copilot 是一个由 Amazon Web Services (AWS) 提供的命令行工具,它简化了容器化应用程序的部署和管理过程。特别是,对于那些希望使用 AWS Elastic Container Service (ECS) 和 AWS Fargate 部署和管理容器化应用的开发者,AWS Copilot 提供…

通过 Docker 部署 S3 对象存储服务器的终极教程

在当今数据驱动的时代,拥有一个灵活且高效的对象存储解决方案至关重要。利用 Docker 部署 S3 对象存储服务器,不仅可以提升数据管理的灵活性,还能大幅降低运营成本。本文将为您提供详细步骤,助您轻松搭建 S3 存储解决方案。 如何…

Python分享20个Excel自动化脚本

在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…

HTML中的图片标签详解及路径使用【学术投稿-第五届环境资源与能源工程国际学术会议(ICEREE 2025)】

官网:www.iceree.org 会议时间:2025年2月21-23日 会议地点:中国-昆明 简介 第五届环境资源与能源工程国际学术会议(ICEREE 2025)将于2025年2月21日至23日在中国昆明隆重举行。主要围绕“能源工程和能源技术”、“环…

【提高】跳石头

一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中&#xf…

快手ip属地是定位吗?怎么改

在当今数字化时代,随着网络平台的不断发展,用户隐私和数据安全成为了公众关注的焦点。各大社交媒体平台纷纷推出的“IP属地”功能,无疑为网络环境增添了一抹新的色彩。其中,快手的IP属地显示功能尤为引人注目。那么,快…

蓝桥杯备考:二维前缀和算法模板题(二维前缀和详解)

【模板】二维前缀和 这道题如果我们暴力求解的话,时间复杂度就是q次查询里套两层循环最差的时候要遍历整个矩阵也就是O(q*n*m) 由题目就是10的11次方,超时 二维前缀和求和的公式(创建需要用到)f[i][j]就是从&#xf…

网络安全(黑客)——自学2025

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“…