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