7个版本 (破坏性)
| 0.6.0 | 2022年2月11日 |
|---|---|
| 0.5.0 | 2022年2月1日 |
| 0.4.0 | 2021年11月17日 |
| 0.3.0 | 2021年11月13日 |
| 0.1.1 | 2021年10月31日 |
#393 in 内存管理
每月下载 24 次
115KB
2K SLoC
hybrid-rc - 线程安全的混合引用计数指针
用法
- 将以下内容添加到您的Cargo.toml
[dependencies]
hybrid-rc = "0.5.0"
- 阅读crate文档
功能
hybrid-rc crate提供了泛型类型HybridRc<T, State>和Weak<T>用于引用计数指针。
它基于"偏斜引用计数:在垃圾回收中减少原子操作" 中描述的算法,但适应了Rust的类型系统和其缺乏托管运行时环境。
原子和非原子引用计数的切换通过类型系统管理
HybridRc<T, Local>(类型别名为Rc):非常快,但仅适用于一个线程。HybridRc<T, Shared>(类型别名为Arc):较慢,但适用于所有情况。
两种变体的实例可以相互转换。特别是,可以使用 HybridRc::to_shared(&rc) 或 .into() 将 Rc 转换为 Arc。另一方面,如果没有其他线程持有相同值的 Rc,则可以使用 HybridRc::to_local(&arc) 或 .try_into() 将 Arc 转换为 Rc。
任务
- 实现了所有稳定的
Rc/Arc功能-
新功能() -
as_ptr() -
get_mut() -
get_mut_unchecked() -
make_mut() -
into_raw() -
from_raw() -
pin() -
try_unwrap() -
weak_count() -
strong_count() -
[in|de]crement_strong_count()(作为increment_shared_strong_count()等) -
ptr_eq() -
downcast() -
impl AsRef -
impl Borrow -
impl Clone -
impl Debug -
impl Default -
impl Deref -
impl Display -
impl Drop -
impl From<&[T]> -
impl From<&str> -
impl From<String> -
impl From<Box<T>> -
impl From<Cow<'a, T> -
impl From<T> -
impl From<Vec<T>> -
impl FromIteratorTrustedLen的特殊化
-
impl Into<Waker> -
impl Hash -
impl Ord -
impl PartialEq,impl Eq -
impl PartialOrd -
impl Pointer -
deref(),borrow(),as_ref() - 弱指针(
downgrade(),upgrade())
-
- 在本地和共享的
HybridRc之间进行转换-
to_shared(),to_local() -
impl From,impl TryFrom
-
- 便利的类型别名
- 无尺寸强制转换
- 使用
From向HybridRc<dyn Any, _>升级 - 使用
From将HybridRc<[T; N], _>转换为HybridRc<[T], _>
- 使用
- 最小化内存开销
- 支持创建循环引用 (
new_cyclic()) - 完全支持
Pin(包括升级/降级到PinWeak)
性能
Rc::clone() 和 Arc::clone() 以及 Rc::drop() 和 Arc::drop() 的运行时间几乎与它们的标准库对应版本相同。
Weak 引用模仿了 std::sync::Weak,因此始终使用原子操作。与标准库的对应版本相比,Weak::clone() 和升级到 Arc 会稍微慢一些。Weak::upgrade_local() 比比 Weak::upgrade() 约慢 15%。
Rc::to_shared() 的成本几乎与 Arc::clone() 相同,而 Arc::to_local() 的成本大约与 Weak::upgrade() 相同。
每个分配的内存开销大约是标准库对应版本的两倍,以容纳额外的引用计数和拥有线程的线程 ID(在 x86_64 上,每个分配为 32 字节)。指针对象本身的大小与 NonNull<T> 相当。
示例基准测试
在英特尔酷睿 i7-4790K 上执行的基准测试。仅供参考。
std::rc::Rc |
HybridRc<T, Local> |
HybridRc<T, Shared> |
std::sync::Arc |
|
|---|---|---|---|---|
clone() |
1.5 纳秒 | 1.5 纳秒 | 5.0 纳秒 | 5.0 纳秒 |
drop() |
1.5 纳秒 | 1.6 纳秒 | 4.6 纳秒 | 6.3 纳秒 |
to_local() |
8.2 纳秒 | |||
to_shared() |
5.0 纳秒 | |||
downgrade() |
1.5 纳秒 | 8.0 纳秒 | 8.0 纳秒 | 7.8 纳秒 |
upgrade*() |
1.6 纳秒 | 9.4 纳秒 | 8.2 纳秒 | 8.0 纳秒 |
no_std 支持
此包为 no_std 环境提供有限支持。在此模式下,只有当 任何 线程上都没有 Rc 时,Arc::to_local() 和 Weak::upgrade_local() 才能成功,因为如果没有 std,则无法可靠地识别线程。
要启用 no_std 模式,请在 Cargo.toml 中禁用默认启用的 std 功能。需要全局分配器。
支持的 Rust 版本
支持的最小 Rust 工具链版本是 Rust 1.55.0。
支持 no_std 功能的最小 Rust 工具链版本是 Rust 1.56.0。
稳定性
此包遵循 语义版本控制,并额外承诺在 1.0.0 以下不会引入向后不兼容的更改,仅通过更改补丁级别版本号。
许可
遵循 Mozilla 公共许可证,版本 2.0 (LICENSE 或 https://www.mozilla.org/en-US/MPL/2.0/).
贡献
除非您明确表示,否则您有意提交给工作以供包含的贡献将按照上述许可进行,包括与二级许可证的兼容性,如 MPL 所定义。