10个版本 (2个稳定版本)

使用旧的Rust 2015

2.0.0 2021年4月11日
1.0.0 2020年7月23日
0.4.2 2019年4月23日
0.3.0 2018年4月16日
0.1.0 2017年8月25日

#275内存管理


用于 2 个Crates(通过 havo

MIT 许可证

23KB
478 代码行

WRC

Rust的线程安全加权引用计数智能指针。

概述

通过使用权重而不是直接引用计数,WRC大约需要一半的同步操作和对堆的写入。每次WRC被克隆时,其权重被分成两半,一半分配给父节点,一半分配给子节点。当WRC被丢弃时,其权重从总数中移除。当总权重下降到零时,引用的对象将被丢弃。

特性

  • 线程安全。
  • 高效。
  • 轻量级。

示例

在多个线程之间共享一些不可变数据

use wrc::Wrc;
use std::thread;

let five = Wrc::new(5);

for _ in 0..10 {
    let five = five.clone();
    thread::spawn(move || {
        println!("{:?}", five);
    });
}

共享一个可变的 AtomicUsize

use wrc::Wrc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;

let val = Wrc::new(AtomicUsize::new(5));

for _ in 0..10 {
    let val = val.clone();

    thread::spawn(move || {
        let v = val.fetch_add(1, Ordering::SeqCst);
        println!("{:?}", v);
    });
}

基准测试

已经使用 Criterion 构建了简单的基准测试。您可以使用 cargo bench 运行它们进行比较。每个基准测试都会分配一个所有权的字符串,并在克隆和丢弃指针之前将其放入智能指针中32次。

在我的机器上(2017 13" MacBook Pro,双核2.5GHz i7)我得到以下结果

arc 32                  time:   [470.93 ns 472.80 ns 474.90 ns]
rc 32                   time:   [161.00 ns 162.08 ns 163.45 ns]
wrc 32                  time:   [215.32 ns 217.14 ns 219.24 ns]

如预期的那样,该算法的运行速度大约是原子引用计数的两倍,比标准引用计数慢约33%,这使得它对于需要在线程安全和性能之间取得平衡的项目来说是一个很好的选择。

许可证

源代码根据MIT许可证的条款进行许可,许可证的文本包含在本分布的LICENSE文件中。

没有运行时依赖项