1 个不稳定发布

0.1.0 2024年1月7日

#1395数据结构

Download history 1/week @ 2024-04-15 53/week @ 2024-04-22 7/week @ 2024-05-13 22/week @ 2024-05-20 20/week @ 2024-05-27 16/week @ 2024-06-03 4/week @ 2024-06-10 14/week @ 2024-06-17 22/week @ 2024-06-24 22/week @ 2024-07-01 95/week @ 2024-07-08 97/week @ 2024-07-15 77/week @ 2024-07-22

每月291 次下载

MIT 许可证

9KB
141 代码行

提供对 [Arc] 的原子指针。

AtomicArc 是一个指向 [Arc] 的 AtomicPtr,支持原子交换和存储操作。底层的 [Arc] 引用计数管理底层内存的释放,而 AtomicArc 管理在任何时刻被线程加载的底层 [Arc]。具体来说,对 AtomicArc 的加载操作会增加引用计数,返回 [Arc] 的强引用,确保只有当所有引用都被丢弃时,底层内存才会被释放。

示例

通常会将 AtomicArc 包裹在 [Arc] 中,以允许跨线程共享。

# use std::sync::Arc;
# use std::thread;
# use arc_atomic::AtomicArc;
let arc = Arc::new(AtomicArc::new(Arc::new(1)));
let handle = arc.clone();
thread::spawn(move || {
    let val = *handle.load();
    println!("{val}"); // may print '1' or '2'
});
let prev = *arc.swap(Arc::new(2));
println!("{prev}"); // prints '1'

设计

对所有底层 AtomicPtr 的加载/交换操作使用顺序一致排序。这确保了交换操作将原子地交换到一个新的 Arc 指针,该指针将被任何线程上后续的加载操作观察到。此行为通过使用 loom 进行测试并使用 miri 编译得到验证。

这个crate提供的功能与 arc-swap 类似,尽管通过避免提供线程本地指针缓存来简化了提供可交换性的底层机制。

依赖

~0–24MB
~336K SLoC