Multithreading Rust mpsc::无法在线程之间共享发送器?

Multithreading Rust mpsc::无法在线程之间共享发送器?,multithreading,rust,Multithreading,Rust,我认为通道的全部目的是在线程之间共享数据。我有这个密码: 其中tx是一个mpsc::发送方 error[E0277]:未满足特性绑定'std::sync::mpsc::Sender:std::marker::sync' -->src/my_module/my_file.rs:137:9 | 137 |线程::生成{ | ^^^^^^^^^^^^^ | =注意:`std::sync::mpsc::Sender`不能在线程之间安全共享 =注意:由于“&std::sync::mpsc:

我认为通道的全部目的是在线程之间共享数据。我有这个密码:

其中
tx
是一个
mpsc::发送方

error[E0277]:未满足特性绑定'std::sync::mpsc::Sender:std::marker::sync'
-->src/my_module/my_file.rs:137:9
|
137 |线程::生成{
|         ^^^^^^^^^^^^^
|
=注意:`std::sync::mpsc::Sender`不能在线程之间安全共享
=注意:由于“&std::sync::mpsc::Sender”的impl上的要求,因此必需`
=注意:必需,因为它出现在类型中`[closure@src/my_module/my_file.rs:137:23:153:10 res:&&str,ctx:&&my_module::my_子模块::Reader,tx_线程:&std::sync::mpsc::Sender]`
=注意:`std::thread::spawn'需要`
我不知道哪里出错了。除非我找错了地方,我的问题实际上是我使用了
让ctx=self;

发送者不能在线程之间共享,但可以发送

它实现trait
Send
,但不实现
Sync
(Sync:Safe,跨线程访问对
Sender
的共享引用)

通道的设计要求您
.clone()
发送程序并将其作为值传递给线程(对于您拥有的每个线程)。您缺少线程闭包上的
move
关键字,该关键字指示闭包通过拥有变量来捕获变量

如果必须在多个线程之间共享单个通道端点,则必须将其包装在互斥体中。
mutex
Sync+Send,其中T:Send

有趣的实现说明:通道开始用作流,其中它有一个生产者。内部数据结构在第一次克隆发送方时升级为多生产者实现。

您可以从标准库中使用。不同之处在于它实现了
同步
特性,但可能会如果发送消息时内部缓冲区中没有空间,则阻止

有关更多信息:


对于
发送
同步
,您可能需要阅读
let tx_thread = tx.clone();
let ctx = self;
thread::spawn(|| {
    ...
    let result = ctx.method()
    tx_thread.send((String::from(result), someOtherString)).unwrap();
})