6 releases
0.1.6 | Sep 21, 2023 |
---|---|
0.1.5 | Mar 25, 2023 |
0.1.3 | Mar 4, 2022 |
0.1.2 | Dec 23, 2021 |
#215 in Concurrency
5,728 downloads per month
27KB
461 lines
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
Dependencies
~0.1–24MB
~337K SLoC