2 个不稳定版本
| 0.2.0 | 2022年10月20日 |
|---|---|
| 0.1.0 | 2021年7月4日 |
#692 in 并发
每月下载量 176
用于 bztree
43KB
755 行
多词 CAS。
Rust 标准库在 atomic 包中提供了原子类型。原子类型提供了无锁方式来原子更新一个指针的值。许多并发数据结构通常需要一次更新多个指针。例如,在 论文(Rust 中的实现 在此) 中描述的 BzTree。
此包提供了一种称为 MwCas 的并发原语,它可以一次原子更新多个指针。它基于论文 Easy Lock-Free Indexing in Non-Volatile Memory。当前实现不提供非易失性内存(持久内存)的功能,仅涵盖 DRAM 多词 CAS。
平台支持
目前,MwCas 仅支持 x86_64 平台,因为它利用了特定平台的黑客技巧:MwCas 使用指针的虚拟地址的高3位来表示内部状态。今天 x86_64 CPU 使用虚拟地址的低位48位,其他16位为0。论文中描述了高位3位的用法。
用法
MwCas 结构体代表多词 CAS API,可以操作两种类型的指针
- 堆分配数据的指针(
HeapPointer) - u64 的指针(
U64Pointer)
HeapPointer 可以用于对任何数据类型执行多词 CAS,但代价是堆分配。 U64Pointer 不在堆上分配任何内容,并且内存开销与 u64 相同。
MwCas 是一系列 compare_exchange 操作的容器。当调用者添加所有所需的 CAS 操作后,它通过调用 exec 方法执行多词 CAS。 exec 方法返回 bool,表示 MwCAS 是否成功。
MwCAS 用法的示例
use mwcas::{MwCas, HeapPointer, U64Pointer};
let ptr = HeapPointer::new(String::new());
let val = U64Pointer::new(0);
let guard = crossbeam_epoch::pin();
let cur_ptr_val: &String = ptr.read(&guard);
let mut mwcas = MwCas::new();
mwcas.compare_exchange(&ptr, cur_ptr_val, String::from("new_string"));
mwcas.compare_exchange_u64(&val, 0, 1);
assert!(mwcas.exec(&guard));
assert_eq!(ptr.read(&guard), &String::from("new_string"));
assert_eq!(val.read(&guard), 1);
内存回收
替换 CAS 期间替换的新值指向的 HeapPointer 的值,将由 crossbeam_epoch 内存回收执行。
依赖关系
~255KB