atomic_once_cell

Crates.ioatomic_once_cell
lib.rsatomic_once_cell
version0.1.6
sourcesrc
created_at2021-12-21 21:30:39.604004
updated_at2023-09-21 09:31:05.848156
descriptionThread-safe and lock-free OnceCell and Lazy
homepage
repositoryhttps://github.com/rustne-kretser/atomic_once_cell
max_upload_size
id501338
size26,131
Eivind Alexander Bergem (eivindbergem)

documentation

README

Pipeline Crates.io API reference

atomic_once_cell

atomic_once_cell provides two new types, [AtomicOnceCell] and [AtomicLazy], which are thread-safe and mostly lock-free drop-in replacements of [core::lazy::OnceCell] and [core::lazy::Lazy] suitable for use in #[no_std] environments.

Blocking

Because dereferencing [AtomicLazy] can't fail, it can't be lock-free (if you know a way, please tell me).

Both types can be used in a non-blocking way, but there are some blocking calls that should not be used from interrupt handlers or other contexts where blocking will lead to a deadlock. Blocking is based on crossbeam::utils::Backoff, and will be reduced to a spinlock in #[no_std] environments.

Examples

AtomicOnceCell

use atomic_once_cell::AtomicOnceCell;

static CELL: AtomicOnceCell<String> = AtomicOnceCell::new();

fn main() {
    CELL.set("Hello, World!".to_owned()).unwrap();

    assert_eq!(*CELL.get().unwrap(), "Hello, World!");
}

AtomicLazy

use atomic_once_cell::AtomicLazy;

static LAZY: AtomicLazy<String> = AtomicLazy::new(|| "Hello, World!".to_owned());

fn main() {
    assert_eq!(*LAZY, "Hello, World!");
}

For more details, see docs.

Usage

Add this to your Cargo.toml:

[dependencies]
atomic_once_cell = "0.1.6"

License

MPL-2.0

Commit count: 51

cargo fmt