3个版本
0.1.2 | 2023年6月6日 |
---|---|
0.1.1 | 2023年6月5日 |
0.1.0 | 2023年5月30日 |
1861 在 编码
每月下载1,073次
18KB
235 行
Ref-Swap
AtomicPtr的安全包装。它不是交换指针,而是使用引用和生命周期进行操作,允许安全的API。提供了两种版本
RefSwap
用于交换引用OptionRefSwap
用于交换Option<&T>
。OptionRefSwap
将None
编码为空指针,没有额外的开销。
使用引用
use ref_swap::RefSwap;
use core::sync::atomic::Ordering;
let a = 10;
let b = 20;
let reference = RefSwap::new(&a);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, &a);
assert!(core::ptr::eq(loaded, &a));
reference.store(&b, Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, &b);
assert!(core::ptr::eq(loaded, &b));
使用可选引用
use ref_swap::OptionRefSwap;
use core::sync::atomic::Ordering;
let a = 10;
let b = 20;
let reference = OptionRefSwap::new(None);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, None);
reference.store(Some(&b), Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, Some(&b));
assert!(core::ptr::eq(loaded.unwrap(), &b));
reference.store(Some(&a), Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, Some(&a));
assert!(core::ptr::eq(loaded.unwrap(), &a));
许可证
该项目遵循GNU Lesser General Public License (LGPL) 版本 3。配置文件和示例遵循CC0 1.0许可证。有关更多信息,请参阅每个文件中的许可证标题。您可以在LICENSES
目录中找到许可证文本。
该项目符合REUSE规范版本3.0。