这个问题深入研究从 32 位原子整数创建 64 位原子计数器。计数器有一个写入器和多个读取器,写入器是不得阻塞的信号处理程序。
建议的解决方案采用生成计数,使用低位作为读取锁定。读取器重试,直到生成计数在读取过程中稳定,并且低位未设置。
提供的代码通常遵循 SeqLock 的正确设计原则,SeqLock 是一种已知的使用序列号实现无锁原子计数器的模式。内存排序的使用是合理的,确保计数器以原子方式更新。
但是,值得注意的是,如果系统支持更便宜的 64 位原子加法或加载。相反,简单地加载两半,然后进行非原子增量,并且结果的原子存储就足够了。
此外,序列计数器还可以避免原子 RMW 操作,除非它用作自旋锁多个作家。通过单个编写器,它可以使用带有发布排序的纯加载和纯存储,这比原子 RMW 或带有 seq_cst 排序的存储更有效。
绕过以下限制原子对于较大的类型,可以考虑使用 volatile uint64_t 和atomic
另一种替代方法是实现一个 SeqLock 模板,该模板动态检查目标是否支持原子
总之,虽然提供的代码提供了使用 32 位原子的 64 位原子计数器的功能实现,但是可以提高性能并简化代码的潜在优化和替代方案。
以上是如何仅使用 32 位原子来实现 64 位原子计数器?的详细内容。更多信息请关注PHP中文网其他相关文章!