6 个版本
使用旧的 Rust 2015
0.3.0 | 2023年8月16日 |
---|---|
0.2.1 | 2023年8月16日 |
0.1.10 | 2023年2月28日 |
在 并发 中排名第 372
115KB
2K SLoC
BackdropArc ─

一个支持使用 backdrop 进行自定义释放策略的 Arc(原子引用计数智能指针)。
backdrop_arc::Arc<T, BackdropStrategy>
与 std::sync::Arc<T>
非常相似,除了两个区别
1. 释放策略
当特定 Arc 的最后一个克隆对象超出作用域时,不是正常释放,而是调用特定的 BackdropStrategy。这样,就可以在后台线程、后台 tokio 任务、延迟到稍后等情况下释放大型或复杂结构。
这允许更好地推理使用 Arc 的代码将花费多长时间,因为这不再依赖于“我是否拥有最后一个 Arc?”。
一个 backdrop_arc::Arc<T, S>
的行为与 Arc<backdrop::Backdrop<Box<T>, S>>
类似,因为在最后一个 Arc 克隆退出作用域时执行背衬策略。与 Arc<backdrop::Backdrop<Box<T>, S>>
的区别在于没有双重指针间接引用(arc -> box -> T),管理分配的 T
是直接在 Arc 中完成的。
2. 没有弱引用 => 更小的弧,可预测的释放行为
std::sync::Arc<T>
允许使用弱引用。这在内部自我引用的结构(树、图)中非常有用,但通常不需要。另一方面,弱引用并不是“免费”的
- 因为它们需要存储
(ptr, reference_count)
,而不是(ptr, reference_count, weak_reference_count)
。 - 它们使得释放
Arc<T>
更为复杂。当最后一个强引用退出作用域时,将运行T
的“释放胶水”。但是为了防止弱引用悬挂,只有当最后一个Weak
引用退出作用域时才释放T
(见此处)。正如你所想象的那样,这种“两阶段释放”与BackdropStrategy
相互作用不好,因为我们希望在释放时将对象移动到后台线程,因为我们需要确保T
的分配足够长。
因此,backdrop_arc
模仿了优秀的 triomphe
库。将 backdrop_arc::Arc
转换为 triomphe::Arc
或从 triomphe::Arc
转换为 backdrop_arc::Arc
是零成本操作,因为两个类型在内存中的表示保证相同。(同样适用于 backdrop_arc::UniqueArc
<-> triomphe::UniqueArc
)
不支持弱引用使得其他一些特性成为可能
backdrop_arc::Arc
不需要任何读-改-写操作来处理弱引用的可能性。backdrop_arc::UniqueArc
允许构建一个临时的可变backdrop_arc::Arc
,稍后可以将其转换为普通的backdrop_arc::Arc
。backdrop_arc::OffsetArc
可以在 C++ 代码中透明使用,并且与 (并且可以转换为)backdrop_arc::Arc
兼容。backdrop_arc::ArcBorrow
在功能上类似于&backdrop_arc::Arc<T>
,然而在内存中它仅仅是&T
。这使得它在 FFI 中更加灵活;借用源不需要是一个固定在栈上的 Arc(可以是 C++ 的指针,或者一个OffsetArc
)。此外,这有助于避免指针追踪。backdrop_arc::Arc
可以通过from_header_and_iter
构建用于动态大小的类型。backdrop_arc::ArcUnion
是两个backdrop_arc:Arc
的联合,它们适合于一个内存字中。
特性
backdrop_arc
支持 no_std 环境,只要alloc
可用,通过禁用(默认启用)std
特性。serde
:启用与serde
crate 的序列化/反序列化。stable_deref_trait
:为backdrop_arc::Arc
实现stable_deref_trait
crate 的StableDeref
特性。arc-swap
:与backdrop_arc::Arc
一起使用arc-swap
crate。triomphe
:在triomphe::Arc
<->backdrop_arc::Arc
(以及backdrop_arc::UniqueArc
<->triomphe::UniqueArc
)之间转换(零成本)。unsize
使用与backdrop_arc::Arc
一起的unsize
包。yoke
:为CloneableCart
特性实现提供支持,该特性来自yoke
包,以便于在零拷贝序列化场景中使用。
归属
backdrop_arc
的源代码高度基于(并最初是从)triomphe
衍生而来,而 triomphe
本身源自 servo_arc
。
最小支持的 Rust 版本
backdrop_arc 的最小支持 Rust 版本是 Rust 1.56.1,因为 backdrop
使用了 2021 版 Rust 语法。除了 backdrop
之外,没有(必需的)Rust 功能或(必需的)依赖项,这使得这个包非常轻量级和可移植。
变更日志
- 0.3.0:
- 用更友好实现和签名替换了
Arc::clone_many
。
- 用更友好实现和签名替换了
- 0.2.0:
- 增加了对
yoke
的可选支持(将backdrop_arc::Arc
作为yoke::CloneableCart
使用)。使用yoke
功能启用。 - 增加了
Arc::clone_many
和Arc::clone_many_into_slice
,允许您通过仅一个原子屏障一次性克隆多个 Arc。
- 增加了对
- 0.1.x:初始版本
依赖项
~35–320KB