9 个稳定版本
1.4.1 | 2024年2月9日 |
---|---|
1.3.0 | 2023年3月13日 |
1.2.1 | 2022年11月5日 |
1.1.0 | 2021年12月12日 |
1.0.0 | 2020年11月5日 |
#134 in 并发
每月105次下载
在 supergit 中使用
17KB
215 行
AtomPtr
一个安全的原子指针包装器,用于在顶部构建数据结构和无锁算法。仅使用 std
作为依赖。
标准库包含一个 AtomicPtr
类型,它本身使用起来非常不便捷,因为它处理原始指针。很容易误用此 API 并导致内存泄漏或双重释放。
此库对您如何使用数据做出了一些假设。此外,在没有某种其他内存管理策略的情况下使用原始指针是危险的。此 crate 使用 Arc<T>
来处理引用生命周期管理。在 AtomPtr<T>
中的数据也是 始终 堆分配的。
以下是一个简单的示例。
use atomptr::AtomPtr;
struct MyData { name: String }
let data = MyData { name: "Kookie".into() };
let a = AtomPtr::new(data);
println!("Name is: {}", a.get_ref().name);
let old_ref = a.swap(MyData { name: "Bob".into() });
println!("Name now is: {}, was {}", a.get_ref().name, old_ref.name);
因为所有数据都由 Arc<T>
内部包装,返回底层数据的引用并不意味着它从指针本身删除,或在 Ref<T>
范围退出后解除分配。另一个线程当然可以交换指针中包含的数据,这就是为什么 compare_exchange
需要一个先前持有的数据引用。
许可证
此微库是免费软件,并根据 GNU 通用公共许可证版本 3.0 或(根据您的选择)任何后续版本进行许可。
附加许可:若要提交到 Apple App Store:前提是您遵守 GPLv3 的规定(包括但不限于根据 GPLv3 第 6 条提供相应的源代码),qaul.net 开发者还授予您附加许可,通过 Apple App Store 传递程序的源代码版本以外的非源代码可执行版本,仅作为每个相关受覆盖工作的可执行版本,根据 Mozilla 公共许可证版本 2.0 进行传递。
此存储库中包含 GPL-3.0 和 MPL-2.0 许可证文本的副本。