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;
?发送者不能在线程之间共享,但可以发送
它实现traitSend
,但不实现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();
})