#状态管理 #线程局部 #全局 #静态 #tls #单例

状态

一个用于安全且易于实现全局和线程局部状态管理的库

17 个版本

0.6.0 2023年5月25日
0.5.3 2022年5月3日
0.5.2 2021年6月19日
0.4.2 2020年10月28日
0.2.0 2017年1月21日

#16并发

Download history 64094/week @ 2024-03-14 65962/week @ 2024-03-21 63117/week @ 2024-03-28 62955/week @ 2024-04-04 65096/week @ 2024-04-11 62348/week @ 2024-04-18 64580/week @ 2024-04-25 63531/week @ 2024-05-02 65397/week @ 2024-05-09 67784/week @ 2024-05-16 68088/week @ 2024-05-23 72022/week @ 2024-05-30 66366/week @ 2024-06-06 69831/week @ 2024-06-13 67310/week @ 2024-06-20 58012/week @ 2024-06-27

274,604 每月下载量
655 个 Crates 中使用 (30 直接)

MIT/Apache

74KB
783

stateci.svg crates.io docs.rs

Rust 库,用于安全且易于实现全局和线程局部状态管理。

extern crate state;

static GLOBAL: state::InitCell<u32> = state::InitCell::new();

GLOBAL.set(42);
assert_eq!(*GLOBAL.get(), 42);

此库可用于轻松实现

  • 延迟全局静态
  • 单例,初始化一次的值
  • 全局或线程局部缓存,懒加载
  • 动态初始化的线程局部数据
  • 类型映射,基于类型的类型映射

更多信息请参阅 文档

用法

在您的 Cargo.toml 中包含 state

[dependencies]
state = "0.6.0"

默认情况下未启用线程局部状态管理。您可以通过 tls 功能来启用它

[dependencies]
state = { version = "0.6.0", features = ["tls"] }

MSRV

state 版本 0.6 开始,最低支持的 Rust 版本是 1.61.0

正确性

state 已经经过手动和自动的广泛审查,以确保其正确性和稳定性。所有不安全代码,包括内部并发原语、TypeMapInitCell,都经过彻底验证,以确保成对并发正确性和内部别名排除与 loom。多线程不变性、别名不变性和其他稳定性属性通过 miri 进行验证。验证在每个提交上由 CI 运行。

性能

state 经过大量优化,以实现最佳性能。 InitCell 适用于全局存储检索;它比通过 lazy_static! 初始化的全局状态访问 稍微快一些,在多线程环境中更是如此。 LocalInitCell 由于线程查找而承担轻微的开销。然而,LocalInitCell 没有同步开销,因此多线程中从 LocalInitCell 进行检索比通过 InitCell 更快。

请注意,state 允许在程序的任何位置进行全局初始化。其他解决方案,如 lazy_static!thread_local!,仅允许事先初始化。换句话说,state 的能力是 lazy_static!thread_local! 提供能力的超集,同时性能更优。

测试

测试可以在 tests 目录中找到。您可以使用以下命令运行测试:cargo test --all-features。可以使用以下命令运行 Loom 验证:RUSTFLAGS="--cfg loom" cargo test --release --test loom

许可证

state 根据您的选择,可使用以下任意一种许可证

依赖项

~0–26MB
~334K SLoC