为什么std::atomic_compare_exchange
及其所有兄弟姐妹更新传递的期望值?
我想知道除了循环中给定的简单性之外是否有任何理由,例如:是否有一个内部函数可以在一次操作中实现这一点以提高性能?
答案 0 :(得分:7)
处理器必须加载当前值,以便执行操作的“比较”部分。当比较失败时,调用者需要知道新值,重试比较交换(你几乎总是在循环中使用它),所以如果没有返回(例如通过修改引用传递的期望值)那么调用者需要做另一个原子加载来获得新值。这很浪费,因为处理器已经加载了这个值。当极端性能是唯一的选择时,你应该只讨论低级别的原子操作,因此在这种情况下你不想执行两个操作。
答案 1 :(得分:2)
是否有一个内在的功能,可以在一个操作中做到这一点,以提高性能
那可以做什么,具体来说呢?该指令必须加载当前值才能进行比较,因此在不匹配时,产生的当前值不需要任何费用,并且几乎可以保证有用。