#lazy #cell #once

double-checked-cell

A thread-safe lazily initialized cell using double-checked locking

7 stable releases

Uses old Rust 2015

2.0.3 Jun 24, 2020
2.0.2 Jul 27, 2019
2.0.1 Dec 1, 2018
2.0.0 Nov 1, 2018
1.0.0 Nov 2, 2017

#40 in Concurrency

Download history 117/week @ 2020-07-19 101/week @ 2020-07-26 73/week @ 2020-08-02 73/week @ 2020-08-09 79/week @ 2020-08-16 70/week @ 2020-08-23 65/week @ 2020-08-30 386/week @ 2020-09-06 252/week @ 2020-09-13 218/week @ 2020-09-20 521/week @ 2020-09-27 5/week @ 2020-10-04 30/week @ 2020-10-11 120/week @ 2020-10-18 44/week @ 2020-10-25 2/week @ 2020-11-01

493 downloads per month
Used in 2 crates (via novel)

MIT/Apache

18KB
152 lines

double-checked-cell

A thread-safe lazily initialized cell using double-checked locking.

Build Status crates.io docs.rs Passively maintained

Introduction

Provides a memory location that can be safely shared between threads and initialized at most once. Once the cell is initialized it becomes immutable.

If you do not need to change the value after initialization DoubleCheckedCell<T> is more efficient than a Mutex<Option<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));
}

Related crates

  • once_cell - Provides a superset of this crate's functionality, with a nicely consistent API.

These crates are similar but distinct by design:

  • lazy-init – Based on a LazyTransform<T, U> which can lazily consume T to produce an U. Therefore cannot support fallible initialization.
  • lazycellAtomicLazyCell does not support lazy initialization (unlike its non-thread-safe counterpart LazyCell using LazyCell::borrow_with()).
  • mitochondria – Not Sync.
  • lazy_static - With the optional (currently nightly only) const_fn feature, DoubleCheckedCell::new() can also be used in static/const context. However lazy_static! is more convenient when there is only a single way to initialize the cell.

Documentation

Read the documentation

Changelog

  • 2.0.3
    • Update to parking_lot 0.11.
  • 2.0.2
    • Update to parking_lot 0.9.
  • 2.0.1
    • Update to parking_lot 0.7.
  • 2.0.0
    • Changed unwinding behavior: DoubleCheckedCell no longer implements poisoning.
    • New optional cargo features: parking_lot_mutex, const_fn.
  • 1.1.0
    • Fix unsoundness: DoubleCheckedCell<T> where T: !Send cannot be Sync.
  • 1.0.1
    • Ignore unused_unsafe warning due to UnsafeCell::into_inner() no longer beeing unsafe.
  • 1.0.0
    • Initial release.

License

double-checked-cell is licensed under the Apache 2.0 and MIT license, at your option.

Dependencies

~160KB