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

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

DDD
发布: 2024-12-09 04:52:17
原创
971 人浏览过

How Can a 64-Bit Atomic Counter Be Implemented Using Only 32-Bit Atomics?

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

这个问题深入研究从 32 位原子整数创建 64 位原子计数器。计数器有一个写入器和多个读取器,写入器是不得阻塞的信号处理程序。

建议的解决方案采用生成计数,使用低位作为读取锁定。读取器重试,直到生成计数在读取过程中稳定,并且低位未设置。

设计和内存排序

提供的代码通常遵循 SeqLock 的正确设计原则,SeqLock 是一种已知的使用序列号实现无锁原子计数器的模式。内存排序的使用是合理的,确保计数器以原子方式更新。

潜在的改进

但是,值得注意的是,如果系统支持更便宜的 64 位原子加法或加载。相反,简单地加载两半,然后进行非原子增量,并且结果的原子存储就足够了。

此外,序列计数器还可以避免原子 RMW 操作,除非它用作自旋锁多个作家。通过单个编写器,它可以使用带有发布排序的纯加载和纯存储,这比原子 RMW 或带有 seq_cst 排序的存储更有效。

优化和替代方案

绕过以下限制原子对于较大的类型,可以考虑使用 volatile uint64_t 和atomic 的联合。这将允许高效的加载和存储操作。

另一种替代方法是实现一个 SeqLock 模板,该模板动态检查目标是否支持原子上的无锁原子操作。如果没有,它可以透明地回退到避免使用原子 RMW 操作的不同实现。

总之,虽然提供的代码提供了使用 32 位原子的 64 位原子计数器的功能实现,但是可以提高性能并简化代码的潜在优化和替代方案。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板