#sync #thread #original #value #was #constructed #send-sync

threadbound

使任何值都具有 Sync 特性,但仅在原始线程上可用

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并发

Download history 136/week @ 2024-03-13 120/week @ 2024-03-20 171/week @ 2024-03-27 182/week @ 2024-04-03 348/week @ 2024-04-10 248/week @ 2024-04-17 349/week @ 2024-04-24 457/week @ 2024-05-01 349/week @ 2024-05-08 385/week @ 2024-05-15 352/week @ 2024-05-22 319/week @ 2024-05-29 181/week @ 2024-06-05 403/week @ 2024-06-12 253/week @ 2024-06-19 301/week @ 2024-06-26

每月 1,180 次下载

MIT/Apache

10KB
52

ThreadBound<T>

github crates.io docs.rs build status

ThreadBound 是一个包装器,它将一个值绑定到其原始线程。包装器将具有 SyncSend 特性,但只能由构建 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 许可证定义,您有意提交以包含在此软件包中的任何贡献,都将按上述方式双重许可,不附加任何其他条款或条件。

无运行时依赖