Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
9.66k stars 496 forks source link

优化原子操作的性能 #768

Closed Blinue closed 12 months ago

Blinue commented 12 months ago

最近学习了原子操作,发现我以前有着很大误解。内存定序不影响原子对象本身,它决定了编译器和 CPU 能否对其他变量的读取或写入进行重排。比如释放操作要求该操作前的对其他变量的访问不能重排到该操作后,这就保证了释放操作执行后内存状态和代码字面上一致。

因此原子对象有两个特性:

  1. 原子对象的修改始终是原子的,和内存定序无关
  2. 可以用于同步对其他变量的访问,这也是自旋锁可以用原子对象实现的原因

重新检查了代码,发现对原子对象的操作全部使用 memory_order_seq_cst 定序,这没有问题,但会影响性能,因为它强制受影响的内存访问传播到每个核心。很多操作对内存定序没有要求,memory_order_relaxed 就足够了。