ARTICLE · 1077159
Rust `Arc` 源码解析:强引用、弱引用与原
Rust `Arc` 源码解析:强引用、弱引用与原
Rust `Arc` 源码解析:强引用、弱引用与原
我一直以为 Arc 就一个引用计数,结果看源码才发现它管着两套生命周期。
强引用管数据,弱引用管底层内存。所以建 Arc 时,weak 计数默认就是 1——这是强引用们共同捏着的一份隐式弱引用。只要还有强引用,这份隐式计数就保证底层内存不会提前被释放。
克隆时只加一,用最松的原子序数就行。因为调用者手里本来就有个有效的 Arc,对象死不了,没必要多花钱做同步。
真正有意思的是析构和升级。最后一个强引用放手时,先用 Release 退一步,再拿 Acquire 接住之前线程的操作,最后才析构数据。而弱引用想升级成强引用,必须靠 CAS 循环:只有当前计数非零时才加一。一旦看到 0,就永久返回 None,绝不把死掉的对象复活。
这套机制直接决定了怎么用。Arc 只管共享所有权,不提供互斥写入。要是节点间全用强引用,就会形成循环导致内存泄漏。得让“拥有关系”用 Arc,“只是观察”用 Weak。另外,千万别拿 strong_count 当锁用——查完数量和真正拿到锁之间,状态随时会变。
原文Rust `Arc` 源码解析:强引用、弱引用与原子计数
中国香港,8小时前,