显示软件包…
1 个不稳定版本
0.1.0 | 2021 年 3 月 11 日 |
---|---|
0.0.0 |
|
#58 在 #tetcoin
230 每月下载量
用于 49 个软件包 (5 个直接使用)
14KB
128 行
TetsySendWrapper
这个 Rust 库实现了一个名为 SendWrapper
的包装类型,允许你在线程之间移动非 Send
类型,前提是只从原始线程中访问包含的值。你还必须确保在原始线程中丢弃包装器。如果违反了这些约束中的任何一个,将发生 panic。
这个库的想法是在一个基于 GTK+
/gtk-rs
的应用程序的背景下产生的。 GTK+
应用程序是严格单线程的。不允许从除主线程之外的线程调用任何 GTK+
方法。因此,所有 gtk-rs
结构都是非 Send
。
有时你仍然希望在后台执行一些工作。你可以使用 GTK+
调用,并通过 使用 Glib
将其入队以在主线程中执行。这样,你可以知道涉及的 gtk-rs
结构体仅在主线程中被访问,并且也将在那里被丢弃。这个库使得 gtk-rs
结构体可以完全离开主线程,如所提供的
示例
use tetsy_send_wrapper::SendWrapper;
use std::rc::Rc;
use std::thread;
use std::sync::mpsc::channel;
// This import is important. It allows you to unwrap the value using deref(),
// deref_mut() or Deref coercion.
use std::ops::{Deref, DerefMut};
// Rc is a non-Send type.
let value = Rc::new(42);
// We now wrap the value with `SendWrapper` (value is moved inside).
let wrapped_value = SendWrapper::new(value);
// A channel allows us to move the wrapped value between threads.
let (sender, receiver) = channel();
let t = thread::spawn(move || {
// This would panic (because of dereferencing in wrong thread):
// let value = wrapped_value.deref();
// Move SendWrapper back to main thread, so it can be dropped from there.
// If you leave this out the thread will panic because of dropping from wrong thread.
sender.send(wrapped_value).unwrap();
});
let wrapped_value = receiver.recv().unwrap();
// Now you can use the value again.
let value = wrapped_value.deref();
// alternatives for dereferencing:
// let value = *wrapped_value;
// let value: &NonSendType = &wrapped_value;
// alternatives for mutable dereferencing (value and wrapped_value must be mutable too, then):
// let mut value = wrapped_value.deref_mut();
// let mut value = &mut *wrapped_value;
// let mut value: &mut NonSendType = &mut wrapped_value;
许可证
tetsy-send-wrapper
根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款进行分发。
有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。