2 个不稳定版本

0.2.0 2022年10月20日
0.1.0 2021年7月4日

#692 in 并发

Download history 4/week @ 2024-03-11 52/week @ 2024-04-01 6/week @ 2024-04-08 2/week @ 2024-05-20

每月下载量 176
用于 bztree

MIT 许可证

43KB
755

Crate API

多词 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