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

double-checked-cell-async

使用双检查锁实现的线程安全的惰性初始化单元

1 个稳定版本

2.0.2 2020年2月2日

#982并发

49 每月下载量
2 个 Crates 中使用 (通过 novel)

MIT/Apache

18KB
120

async-double-checked-cell

double-checked-cell 的异步分支,使用双检查锁实现的线程安全的惰性初始化单元。

简介

提供一个可以被线程安全共享并在最多一次初始化后变得不可变的内存位置。

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

use double_checked_cell::DoubleCheckedCell;
use futures::future::ready;

let cell = DoubleCheckedCell::new();

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

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

// The cell is already initialized.
let value = cell.get_or_init(async { unreachable!() }).await;
assert_eq!(*value, 42);
assert_eq!(cell.get().await, Some(&42));
  • once_cell - 提供了这个 Crates 功能的超集,具有一致的 API。

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

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

文档

阅读文档

更新日志

  • 2.0.2
    • 更新到 parking_lot 0.9。
  • 2.0.1
    • 更新到 parking_lot 0.7。
  • 2.0.0
    • 更改了 unwinding 行为:DoubleCheckedCell 不再实现 poisoning。
    • 新增可选 cargo 功能:parking_lot_mutexconst_fn
  • 1.1.0
    • 修复不稳定性:当 DoubleCheckedCell<T>T: !Send 不能为 Sync 时。
  • 1.0.1
    • 由于 UnsafeCell::into_inner() 不再是 unsafe 的,忽略 unused_unsafe 警告。
  • 1.0.0
    • 初始发布。

许可证

double-checked-cell 采用 Apache 2.0 和 MIT 许可证,您可自由选择。

依赖项

~725KB
~14K SLoC