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

inf*_*inf 1 c++ multithreading atomic compare-and-swap c++11

为什么std::atomic_compare_exchange及其所有兄弟姐妹都会更新通过的期望值?

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

Jon*_*ely 7

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