1 个稳定版本
2.0.2 | 2020年2月2日 |
---|
#982 在 并发 中
49 每月下载量
在 2 个 Crates 中使用 (通过 novel)
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));
相关 Crates
- once_cell - 提供了这个 Crates 功能的超集,具有一致的 API。
这些 Crates 在设计上相似但有所区别
- lazy-init – 基于
LazyTransform<T, U>
,可以懒惰地消耗T
来产生一个U
。因此不支持失败初始化。 - lazycell –
AtomicLazyCell
不支持懒惰初始化(与使用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_mutex
,const_fn
。
- 更改了 unwinding 行为:
- 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