#arc #drop #sync #background-thread #ffi #data-structures #weak-references

无 std backdrop_arc

Arc 将在后台(稍后,在其他线程,或者两者都是!完全可定制!Tokio 支持!)释放其大型或复杂的内容!

6 个版本

使用旧的 Rust 2015

0.3.0 2023年8月16日
0.2.1 2023年8月16日
0.1.10 2023年2月28日

并发 中排名第 372

MIT/Apache

115KB
2K SLoC

BackdropArc ─ 最新版本 许可 需要: rustc 1.56+

一个支持使用 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 的源代码高度基于(并最初是从)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_manyArc::clone_many_into_slice,允许您通过仅一个原子屏障一次性克隆多个 Arc。
  • 0.1.x:初始版本

依赖项

~35–320KB