当前位置: 首页 > article >正文

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

func AddFloat64(val *float64, delta float64) (new float64) {
	for {
		old := *val
		new = old + delta
		if 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.kler.cn/a/534936.html

相关文章:

  • 【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试
  • 【VM】VirtualBox安装ubuntu22.04虚拟机
  • HTTP和HTTPS协议详解
  • 尝试在Office里调用免费大语言模型的阶段性进展
  • Hive分区和分桶
  • 【大模型】AI 辅助编程操作实战使用详解
  • ESP32开发学习记录---》GPIO
  • 第四十六天|动态规划|子序列|647. 回文子串,5.最长回文子串, 516.最长回文子序列,动态规划总结篇
  • Mac 终端命令大全
  • 记录 | WPF创建和基本的页面布局
  • S4 HANA (递延所得税传输)Deferred Tax Transfer - S_AC0_52000644
  • 基于Hexo实现一个静态的博客网站
  • 本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源框架Ollama
  • 《利用原始数据进行深度神经网络闭环 用于光学驻留空间物体检测》论文精读
  • Temperature、Top-P、Top-K、Frequency Penalty详解
  • 网络安全 | 加密技术揭秘:保护数据隐私的核心
  • 组合总和III(力扣216)
  • 腾讯社招流程记录
  • eclipse memory analyzer(mat)使用笔记
  • Yageo国巨的RC系列0402封装1%电阻库来了
  • 【OpenCV实战】混合运动跟踪算法的视频目标轨迹可视化系统设计与实现
  • 10. 神经网络(二.多层神经网络模型)
  • 面试题-SpringCloud的启动流程
  • 使用 Ollama 在腾讯云服务器环境部署 DeepSeek 大模型实战指南
  • Linux详细讲解
  • 【新手上路】洛谷算法1-1:模拟与高精度(高精度部分)