#tetcoin #send #wrapper #thread-local

tetsy-send-wrapper

这个 Rust 库实现了一个名为 SendWrapper 的包装类型,允许你在线程之间移动非 Send 类型,前提是只从原始线程中访问包含的值。你还必须确保在原始线程中丢弃包装器。如果违反了这些约束中的任何一个,将发生 panic。从 https://github.com/thk1/send_wrapper 分支出来,因为它已经不再维护。

显示软件包…

1 个不稳定版本

0.1.0 2021 年 3 月 11 日
0.0.0 2021 年 3 月 9 日

#58#tetcoin

Download history 59/week @ 2024-03-11 71/week @ 2024-03-18 103/week @ 2024-03-25 114/week @ 2024-04-01 59/week @ 2024-04-08 59/week @ 2024-04-15 61/week @ 2024-04-22 56/week @ 2024-04-29 67/week @ 2024-05-06 73/week @ 2024-05-13 42/week @ 2024-05-20 61/week @ 2024-05-27 55/week @ 2024-06-03 51/week @ 2024-06-10 46/week @ 2024-06-17 77/week @ 2024-06-24

230 每月下载量
用于 49 个软件包 (5 个直接使用)

MIT/Apache

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。

无运行时依赖