Follow

看了2天 folly/atomic_shared_ptr,终于明白它的思想了:
atomic_store(&a, new_a) 时会将 a 的引用计数减 1,按照正常的引用计数方式,如果在实现 atomic_load 时有获得裸指针 ptr,那么 ptr 的有效性是无法保证的。
因此需要避免 atomic_store 引发 a 对象的析构,这也正是 folly 的巧妙之处。假设系统最大并发数为 N,那么如果 atomic_shared_ptr 初始就有 N 的引用计数,atomic_store 析构未被 atomic_load 的部分,即这里隐含着需要记录 atomic_load 的访问次数,然后保证 atomic_load(&a) 内部获得 a 的裸指针必定有效。设同时存在的 atomic_load 并发数为 K,那么在 atomic_store 中减少的引用计数为 (N - K),剩下 K 个。于是将 a 对象的析构工作交给了普通的 shared_ptr。也就避免了前面所说的持有的裸指针失效的情况。

Sign in to participate in the conversation
LinuxRocks.Online

Linux Geeks doing what Linux Geeks do..