Crates.io | threadalone |
lib.rs | threadalone |
version | 0.2.1 |
source | src |
created_at | 2023-03-11 04:38:23.751523 |
updated_at | 2024-01-22 01:54:56.402465 |
description | Make any value Send + Sync but only available on its original thread. Don't use on multi-threaded environments! |
homepage | |
repository | https://github.com/cr0sh/threadalone |
max_upload_size | |
id | 807027 |
size | 22,217 |
This is a fork of dtolnay's threadbound
crate, which allows implementing Send
on non-Copy
types.
The reason that the original crate does not allow it is, if a ThreadBound
object dropped on another thread from where it was created, it cannot be handled in any way.
Instead, this crate aborts if that happens: so be very cautious when using this crate on multi-threaded environemnt.
ThreadBound is a wrapper that binds a value to its original thread. The wrapper
gets to be Sync
and Send
but only the original thread on which the
ThreadBound was constructed can retrieve the underlying value.
[dependencies]
threadbound = "0.1"
Version requirement: 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);
}