#cell #once-cell #once #lazy-evaluation

不维护 double-checked-cell

使用双重检查锁定机制的线程安全的惰性初始化单元格

8个稳定版本

使用旧Rust 2015

2.1.0 2020年12月12日
2.0.3 2020年6月24日
2.0.2 2019年7月27日
2.0.1 2018年12月1日
1.0.0 2017年11月2日

#1150 in 并发

Download history 36/week @ 2024-04-19 39/week @ 2024-04-26 13/week @ 2024-05-03 7/week @ 2024-05-10 15/week @ 2024-05-17 10/week @ 2024-05-24 17/week @ 2024-05-31 24/week @ 2024-06-07 31/week @ 2024-06-14 53/week @ 2024-06-21 149/week @ 2024-06-28 230/week @ 2024-07-05 110/week @ 2024-07-12 161/week @ 2024-07-19 146/week @ 2024-07-26 207/week @ 2024-08-02

每月下载量627
4 个crates中使用(3 个直接使用)

MIT/Apache

19KB
153

double-checked-cell

使用双重检查锁定机制的线程安全的惰性初始化单元格。

Build Status crates.io docs.rs No maintenance intended

已弃用

你可能应该使用 once_cell 而不是这个crate。它提供了这个crate功能的超集,并且API非常一致。它的功能也被考虑纳入 标准库

介绍

提供一个可以安全地在线程之间共享并在最多一次初始化的内存位置。单元格初始化后变为不可变。

如果你在初始化后不需要更改值,则与 Mutex<Option<T>> 相比,DoubleCheckedCell<T> 更高效。

extern crate double_checked_cell;

use double_checked_cell::DoubleCheckedCell;

fn main() {
    let cell = DoubleCheckedCell::new();

    // The cell starts uninitialized.
    assert_eq!(cell.get(), None);

    // Perform potentially expensive initialization.
    let value = cell.get_or_init(|| 21 + 21);
    assert_eq!(*value, 42);
    assert_eq!(cell.get(), Some(&42));

    // The cell is already initialized.
    let value = cell.get_or_init(|| unreachable!());
    assert_eq!(*value, 42);
    assert_eq!(cell.get(), Some(&42));
}

这些crates设计上相似但有所区别

  • lazy-init – 基于 LazyTransform<T, U>,它可以惰性消费 T 产生一个 U。因此不支持失败初始化。
  • lazycellAtomicLazyCell 不支持惰性初始化(与不安全的替代品 LazyCell 使用 LazyCell::borrow_with() 不同)。
  • mitochondria – 不是 Sync
  • lazy_static - 使用可选的(目前仅在nightly中可用) const_fn 功能,DoubleCheckedCell::new() 也可以在静态/const上下文中使用。但是,当只有一个初始化单元格的方法时,lazy_static! 更方便。

文档

阅读文档

变更日志

  • 2.1.0
    • 修复 UnwindSafeRefUnwindSafe 的界限。从技术上讲,这是一个破坏性更改,但由于它是修复错误,因此仍在同一主版本下发布。
  • 2.0.3
    • 更新到 parking_lot 0.11。
  • 2.0.2
    • 更新到 parking_lot 0.9。
  • 2.0.1
    • 更新到 parking_lot 0.7。
  • 2.0.0
    • 改变了反汇编行为:DoubleCheckedCell 不再实现中毒。
    • 新增可选 cargo 功能:parking_lot_mutexconst_fn
  • 1.1.0
    • 修复不安全性:当 DoubleCheckedCell<T>T: !Send 不能是 Sync 时。
  • 1.0.1
    • 由于 UnsafeCell::into_inner() 不再是不安全的,忽略 unused_unsafe 警告。
  • 1.0.0
    • 初始发布。

许可证

double-checked-cell 采用 Apache 2.0 和 MIT 许可证,任选其一。

依赖关系

~10–315KB