首页 >后端开发 >C++ >如何仅使用 32 位原子高效实现 64 位原子计数器?

如何仅使用 32 位原子高效实现 64 位原子计数器?

Linda Hamilton
Linda Hamilton原创
2024-12-17 08:38:25343浏览

How to Efficiently Implement a 64-Bit Atomic Counter Using Only 32-Bit Atomics?

使用 32 位原子实现 64 位原子计数器

在嵌入式系统中,仅使用 32 位原子创建 64 位原子计数器位原子通常是必要的。一种常见的方法是利用生成计数,并将最低有效位用作读锁。然而,问题是是否还有其他潜在的方法以及建议的实现是否是最佳的。

替代方法

推荐的实现是一种可行的方法,但有可以考虑的替代方法:

  • SeqLock 模式: 此技术利用单调增加的世代计数,奇数和偶数交替出现。读取器旋转,直到生成计数稳定并且读取锁定位(最低有效位)未设置。此方法在具有多个读取器但只有一个写入器的场景中提供了改进的性能。
  • 直接 64 位原子操作: 虽然不太常见,但某些系统可能本身支持 64 位原子操作。在这种情况下,直接对 64 位计数器的两半使用原子操作可以消除对锁或序列计数器的需要。

设计注意事项

关于所提供的实现,有几个方面可以优化:

  • 用于生成计数的原子读-修改-写入 (RMW): 可以使用纯加载和存储来代替对生成计数使用原子 RMW 操作发布订单。此更改减少了与 RMW 操作相关的开销。
  • 有效负载的原子增量:没有必要利用原子 RMW 来增量有效负载;纯粹的加载、增量和存储就足够了。此修改进一步减少了维护计数器的开销。

其他注意事项

  • ARM 加载对指令: 一些ARM 架构支持高效的加载对指令(例如 ldrd 或 ldp),可以同时加载64 位值的 32 位一半。利用这些指令可以提高性能。
  • 编译器优化:编译器可能并不总是为 uint64_t 等大型结构上的原子操作生成最佳代码。避免对此类结构的原子访问,而使用 volatile 关键字和内存屏障可以产生更高效的代码。

结论

使用 32 位原子构造 64 位原子计数器的建议技术是合适的,特别是在具有单个写入器和多个读取器的场景中。但是,其他选项(例如 SeqLock 模式或直接 64 位原子操作)可能更适合特定情况。通过解决概述的设计注意事项并探索其他优化,程序员可以进一步提高其实现的效率。

以上是如何仅使用 32 位原子高效实现 64 位原子计数器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn