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 在 并发 中
274,604 每月下载量
在 655 个 Crates 中使用 (30 直接)
74KB
783 行
state
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
已经经过手动和自动的广泛审查,以确保其正确性和稳定性。所有不安全代码,包括内部并发原语、TypeMap
和 InitCell
,都经过彻底验证,以确保成对并发正确性和内部别名排除与 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
根据您的选择,可使用以下任意一种许可证
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
依赖项
~0–26MB
~334K SLoC