为什么std :: atomic_compare_exchange会更新预期值?

时间:2013-11-24 18:42:10

标签: c++ multithreading c++11 atomic compare-and-swap

为什么std::atomic_compare_exchange及其所有兄弟姐妹更新传递的期望值?

我想知道除了循环中给定的简单性之外是否有任何理由,例如:是否有一个内部函数可以在一次操作中实现这一点以提高性能?

2 个答案:

答案 0 :(得分:7)

处理器必须加载当前值,以便执行操作的“比较”部分。当比较失败时,调用者需要知道新值,重试比较交换(你几乎总是在循环中使用它),所以如果没有返回(例如通过修改引用传递的期望值)那么调用者需要做另一个原子加载来获得新值。这很浪费,因为处理器已经加载了这个值。当极端性能是唯一的选择时,你应该只讨论低级别的原子操作,因此在这种情况下你不想执行两个操作。

答案 1 :(得分:2)

  

是否有一个内在的功能,可以在一个操作中做到这一点,以提高性能

那可以做什么,具体来说呢?该指令必须加载当前值才能进行比较,因此在不匹配时,产生的当前值不需要任何费用,并且几乎可以保证有用。