atomic_shared_ptr{
mutable AtomicStruct<PackedPtr, Atom> ptr_;//前48位存共享指针的指针,16位存计数
}
获取指针函数是load
SharedPtr load(std::memory_order order = std::memory_order_seq_cst) const
noexcept {
auto local = takeOwnedBase(order);
return get_shared_ptr(local, false);
}
takeOwnedBase会用CAS的方式给后16位计数加1.重新赋值指针
然后获取共享指针的指针
如果count 已经超过EXTERNAL_OFFSET / 2;,会在共享指针上加1
// Check if we need to push a batch from local -> global
auto batchcount = EXTERNAL_OFFSET / 2;
if (get_local_count(newlocal) > batchcount) {
CountedDetail::inc_shared_count(newlocal.get(), batchcount);
putOwnedBase(newlocal.get(), batchcount, order);
}
set共享指针是store函数
void store(
SharedPtr n,
std::memory_order order = std::memory_order_seq_cst) /* noexcept */ {
auto newptr = get_newptr(std::move(n));
auto old = ptr_.exchange(newptr, order);
release_external(old);
}