compare_exchange_weak和compare_exchange_strong的区别

compare_exchange_weak 和 compare_exchange_strong 的定义:

template< class T >
bool atomic<T>::compare_exchange_weak(T& expected, T desired,
                                       std::memory_order success,
                                       std::memory_order failure) noexcept;

template< class T >
bool atomic<T>::compare_exchange_strong(T& expected, T desired,
                                         std::memory_order success,
                                         std::memory_order failure) noexcept;

其中,atomic<T> 表示一个原子变量的类型,T 是变量的值类型。expected 是传入的期望值(引用),desired 则是新值。这两个函数会比较 expected 和实际值是否相等,如果相等,则将该变量的值修改为 desired,返回 true;否则不做任何修改,返回 false。需要注意的是,这两个函数可能失败,因此需要在循环中不断尝试,直到成功。

success 和 failure 参数分别表示对应的成功和失败内存顺序,用于指定操作的顺序和可见性。这两个参数是可选的,默认值分别是 memory_order::seq_cst 和 memory_order::seq_cst。需要根据具体情况选择合适的内存顺序。

需要注意的是,这两个函数的使用方法相同,区别主要在于它们执行失败时的返回结果和期望值的更新方式。

compare_exchange_weak 和 compare_exchange_strong 都是 C++11 中提供的原子操作函数,用于实现比较和交换(compare-and-swap,CAS)操作。这两个函数的主要区别在于它们在执行失败时返回的值以及对期望值的修改方式。

具体来说,在执行 CAS 操作时,compare_exchange_weak 函数返回一个 bool 类型的值,表示操作是否成功。如果成功,则将目标值更新为新值(desired),如果失败,则更新期望值为当前值(即 expected 被修改为当前实际值),并返回 false。需要注意的是,由于实现上的一些原因,compare_exchange_weak 可能会出现一些假失败(spurious failure)的情况,即虽然实际值和期望值相等,但是操作却返回了失败。为了避免这种情况,通常需要使用循环结构不断尝试 CAS 操作。

而 compare_exchange_strong 函数则在执行 CAS 操作时,除了返回一个 bool 类型的值表示操作是否成功外,还会更新期望值(即 expected)的值。如果操作成功,则将目标值更新为新值,返回 true。如果操作失败,则将期望值修改为当前值,并将实际值存储在 expected 中,返回 false。由于更新期望值需要额外的开销,因此相比于 compare_exchange_weak 函数,compare_exchange_strong 函数可能会更加耗时。

综上所述, compare_exchange_weak 与 compare_exchange_strong 的本质区别在于对期望值(即 expected)的处理方式。前者只是在比较失败时将其修改为当前值,而后者则在比较失败时将其更新为当前值。在实际应用中需要根据情况选择合适的函数,权衡性能和正确性。

猜你喜欢

转载自blog.csdn.net/HandsomeHong/article/details/129700363