1 个不稳定版本

0.1.0-preview2019年2月25日

#9 in #stm

MIT 许可证

185KB
5K SLoC

swym

License Cargo Documentation Rust Nightly

swym 是一个实验性的 STM,可用于实现性能接近无锁数据结构的并发数据结构。

有关更多信息,请参阅文档

初始 基准测试 可以在这里找到这里


lib.rs:

一个低级别的交易内存库。

swym 是一个实验性的 STM,可用于实现性能接近无锁数据结构的并发数据结构。

示例

获取 swym 的线程局部状态的句柄

use swym::thread_key;

let thread_key = thread_key::get();

创建新的交易内存单元

use swym::tcell::TCell;

static A: TCell<i32> = TCell::new(0);
let b = TCell::new(42);

执行交易以交换两个值

thread_key.rw(|tx| {
    let temp = A.get(tx, Default::default())?;
    A.set(tx, b.get(tx, Default::default())?)?;
    b.set(tx, temp)?;
    Ok(())
});

功能

  • 在每次交易期间表现得像一个全局锁被持有。这可以通过使用 Ordering::Read 对加载进行一些放松。
  • 针对读取为主的数据结构和现代缓存进行了高度优化。 TCell 将所有数据都内联存储。只读交易不修改任何全局状态,而读写交易仅在提交时修改全局状态。
  • swym 每次交易施加的分配数量应该平均为0,通过重用读取日志/写入日志/垃圾袋来实现。
  • 通过 TPtr 构建递归数据结构的功能仍然是实验性的,但看起来很有希望 - 请参阅 GitHub 上的示例。
  • 由自定义基于时代的回收风格垃圾回收器支持(那里还有很多优化工作要做)。
  • 计划支持嵌套交易,但尚未实现。

共享内存

  • TCell,一个低级别的交易内存位置 - 不执行任何堆分配。
  • TPtr,一个用于构建堆分配数据结构的低级别交易指针。

运行交易

  • rw,启动读写交易。
  • read,启动一个只读事务。
  • try_rw,启动一个读写事务,如果事务无法启动则返回错误。
  • try_read,启动一个只读事务,如果事务无法启动则返回错误。

依赖项