8 个版本
0.1.7 | 2023 年 7 月 15 日 |
---|---|
0.1.6 | 2023 年 3 月 3 日 |
0.1.5 | 2022 年 12 月 17 日 |
0.1.4 | 2022 年 8 月 3 日 |
0.1.0 | 2018 年 11 月 17 日 |
#152 在 并发
每月 1,180 次下载
10KB
52 行
ThreadBound<T>
ThreadBound 是一个包装器,它将一个值绑定到其原始线程。包装器将具有 Sync
和 Send
特性,但只能由构建 ThreadBound 的原始线程检索底层值。
[dependencies]
threadbound = "0.1"
版本要求:rustc 1.31+
示例
extern crate threadbound;
use std::marker::PhantomData;
use std::rc::Rc;
use std::sync::Arc;
use threadbound::ThreadBound;
// Neither Send nor Sync. Maybe the index points into a
// thread-local interner.
#[derive(Copy, Clone)]
struct Span {
index: u32,
marker: PhantomData<Rc<()>>,
}
// Error types are always supposed to be Send and Sync.
// We can use ThreadBound to make it so.
struct Error {
span: ThreadBound<Span>,
message: String,
}
fn main() {
let err = Error {
span: ThreadBound::new(Span {
index: 99,
marker: PhantomData,
}),
message: "fearless concurrency".to_owned(),
};
// Original thread can see the contents.
assert_eq!(err.span.get_ref().unwrap().index, 99);
let err = Arc::new(err);
let err2 = err.clone();
std::thread::spawn(move || {
// Other threads cannot get access. Maybe they use
// a default value or a different codepath.
assert!(err2.span.get_ref().is_none());
});
// Original thread can still see the contents.
assert_eq!(err.span.get_ref().unwrap().index, 99);
}
许可证
许可协议为 Apache License 2.0 或 MIT 许可证,由您选择。除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在此软件包中的任何贡献,都将按上述方式双重许可,不附加任何其他条款或条件。