Atomic Operations
Compare-and-Swap 操作
先假设没人跟我抢,那么我先拿到旧值,等我计算出新值后,再检查现在的值是不是和我拿到的旧值相等:如果不相等,说明有人抢数据了,那么我就重新试一遍;否则说明没人跟我抢,或者没抢过我,那么我就把新值写入.
1 | // val: &AtomicU64 |
CAS 可以确保最终结果正确,但是代价是重试次数可能很多
内存序
Relaxed:只保证原子性,不保证顺序Release:release 之前的 write 不会被重排到 release 之后unlock()
Acquire:acquire 之后的 read 不会重排到 acquire 之前lock()
SeqCst:所有顺序完全一致