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 并发
每月下载量627
在 4 个crates中使用(3 个直接使用)
19KB
153 行
double-checked-cell
使用双重检查锁定机制的线程安全的惰性初始化单元格。
已弃用
你可能应该使用 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
- once_cell – 见上方。
这些crates设计上相似但有所区别
- lazy-init – 基于
LazyTransform<T, U>
,它可以惰性消费T
产生一个U
。因此不支持失败初始化。 - lazycell –
AtomicLazyCell
不支持惰性初始化(与不安全的替代品LazyCell
使用LazyCell::borrow_with()
不同)。 - mitochondria – 不是
Sync
。 - lazy_static - 使用可选的(目前仅在nightly中可用)
const_fn
功能,DoubleCheckedCell::new()
也可以在静态/const上下文中使用。但是,当只有一个初始化单元格的方法时,lazy_static!
更方便。
文档
变更日志
- 2.1.0
- 修复
UnwindSafe
和RefUnwindSafe
的界限。从技术上讲,这是一个破坏性更改,但由于它是修复错误,因此仍在同一主版本下发布。
- 修复
- 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_mutex
,const_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