[学习提问] 你好: ATOM_CAS 实现为什么是 atomic_compare_exchange_weak 而不是 atomic_compare_exchange_strong #1532
Replies: 6 comments
-
既然没有 bug , 为什么要换成 strong . |
Beta Was this translation helpful? Give feedback.
-
有 外围 for 业务兜底, 业务上面没有 bug. 观察到有些平台 atomic_compare_exchange_weak 和 atomic_compare_exchange_strong 底层实现一样的, 理论上也不会有 bug. 例如这样 `#define atomic_compare_exchange_strong_explicit(PTR, VAL, DES, SUC, FAIL) #define atomic_compare_exchange_strong(PTR, VAL, DES) #define atomic_compare_exchange_weak_explicit(PTR, VAL, DES, SUC, FAIL) #define atomic_compare_exchange_weak(PTR, VAL, DES) 区别在于 __atomic_compare_exchange 的 第 4 个参数上面, 用 1 标识 weak 调用, 0 默认 strong 调用. `
|
Beta Was this translation helpful? Give feedback.
-
您好,您发给我的邮件已收到。
|
Beta Was this translation helpful? Give feedback.
-
我的意思是,如果 skynet 在使用 CAS 的时候,都是基于 weak 的定义把事情做对。那么什么时候你想换成 strong 都没有关系。比如有的平台没有 weak 的实现,你可以转到 strong 使用。 反过来就不成立了。一旦用了 strong 语义,就再不能轻易的换回 weak 。 |
Beta Was this translation helpful? Give feedback.
-
恩恩 明白更加清晰了. 谢谢你的指导 |
Beta Was this translation helpful? Give feedback.
-
这里有一份关于哪些情况更应该使用weak还是strong的资料: atomic<> Weapons: The C++ Memory Model and Modern Hardware 里面提到,一般情况下weak用在循环CAS中(简单说就是while(CAS)空循环),strong用在单次条件语句(区别于CAS空循环)中使用。 从这种提倡来看,用于CAS空循环的weak假设下次判断马上发生,那么这次结果就不太重要,会优先使用缓存作出失败判断,从而减少竞争(纯yy)。 |
Beta Was this translation helpful? Give feedback.
-
#define ATOM_CAS(ptr, oval, nval) atomic_compare_exchange_weak(ptr, &(oval), nval)
看文档说:
weak 版本的 CAS 允许偶然出乎意料的返回(比如在字段值和期待值一样的时候却返回了false),
不过在一些循环算法中, 这是可以接受的. 通常它比起 strong 版本有更高的性能.
咱们这里用 atomic_compare_exchange_strong 是否更合适点呢?
Beta Was this translation helpful? Give feedback.
All reactions