1 个不稳定发布
0.1.0 | 2024年1月7日 |
---|
#1395 在 数据结构
每月291 次下载
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