#原子 #无锁 #非阻塞 #无标准库 #替换

无标准库 atomic_once_cell

线程安全且无锁的 OnceCell 和 Lazy

6 个版本

0.1.6 2023年9月21日
0.1.5 2023年3月25日
0.1.3 2022年3月4日
0.1.2 2021年12月23日

#161并发

Download history 948/week @ 2024-04-23 858/week @ 2024-04-30 1132/week @ 2024-05-07 798/week @ 2024-05-14 609/week @ 2024-05-21 852/week @ 2024-05-28 1147/week @ 2024-06-04 1245/week @ 2024-06-11 1021/week @ 2024-06-18 966/week @ 2024-06-25 605/week @ 2024-07-02 824/week @ 2024-07-09 1192/week @ 2024-07-16 876/week @ 2024-07-23 919/week @ 2024-07-30 874/week @ 2024-08-06

每月3,929次下载

MPL-2.0 许可证

27KB
461

Pipeline Crates.io API reference

atomic_once_cell

atomic_once_cell 提供了两种新类型,AtomicOnceCellAtomicLazy,它们是线程安全且主要是无锁的,可以替换 core::lazy::OnceCellcore::lazy::Lazy,适用于在 #[no_std] 环境中使用。

阻塞

由于 AtomicLazy 解引用不会失败,因此它不能是无锁的(如果您知道一种方法,请告诉我)。

这两种类型都可以以非阻塞方式使用,但有一些应该从中断处理程序或其他会导致死锁的上下文中使用的阻塞调用。阻塞基于 crossbeam::utils::Backoff,并在 #[no_std] 环境中减少到自旋锁。

示例

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!");
}

有关更多详细信息,请参阅 文档

使用方法

将此内容添加到您的 Cargo.toml 文件中

[dependencies]
atomic_once_cell = "0.1.6"

许可证

MPL-2.0

依赖项

~0.1–25MB
~337K SLoC