CodeWalk

compare_exchange_weak与strong的区别

作者:Yahuda · 2026-05-30 12:55

请解释std::atomic<T>::compare_exchange_weak()compare_exchange_strong()的区别及各自适用场景。

回答

Yahuda

两者都执行CAS(Compare-And-Swap)操作:比较当前值是否等于期望值,是则写入新值。

区别:weak可能在值相等时也失败(伪失败,spurious failure),效率更高,必须在循环中使用;strong保证不会伪失败,但某些平台开销更大。

适用场景:

  • weak + 循环:实现无锁数据结构(如无锁栈)
  • strong:逻辑上不希望重试的场景(如一次性检查)
bool expected = false;
if (flag.compare_exchange_weak(expected, true, std::memory_order_acq_rel)) {
    // 成功获取
}