Multithreading 使用mpsc::Sender和mpsc::Receiver在线程之间共享

Multithreading 使用mpsc::Sender和mpsc::Receiver在线程之间共享,multithreading,rust,channel,Multithreading,Rust,Channel,我看了这篇文章,但不知道我的代码哪里出了问题。我有一个结构向量,每个结构都包含一个mpsc::Sender和mpsc::Receiver,我试图将这些结构中的每一个移动到一个线程中,并不断得到这个编译错误(对于发送方来说是对称的)。因为发送方和接收方是结构的一部分,所以我不确定如何克隆它们 for obj in objs.iter() { let handle = thread::spawn(move || { ^^^^^^^^^^^^^ `std::sync:

我看了这篇文章,但不知道我的代码哪里出了问题。我有一个结构向量,每个结构都包含一个
mpsc::Sender
mpsc::Receiver
,我试图将这些结构中的每一个移动到一个线程中,并不断得到这个编译错误(对于发送方来说是对称的)。因为发送方和接收方是结构的一部分,所以我不确定如何克隆它们

for obj in objs.iter() {
  let handle = thread::spawn(move || {
               ^^^^^^^^^^^^^ `std::sync::mpsc::Receiver<abc::xyz>` cannot be shared between threads safely
    obj.do_something();
    ...
  });
  ...
}
objs.iter()中obj的
{
让handle=thread::spawn(移动| |){
^^^^^^^^^^^^^无法在线程之间安全地共享'std::sync::mpsc::Receiver'
做某事;
...
});
...
}
对于objs.iter()中的obj{

这意味着
obj
是一个
&T
移动
闭包意味着引用被移动到闭包中,但……就是这样。它是一个引用。这意味着被引用的类型必须是
同步
(由于stdlib线程没有限定作用域,所以编译器最终会告诉您引用的生存期不够长,因此您也会遇到生存期问题)

如果
objs
是一个向量,移除
.iter()
将解决这个问题,尽管它可能会触发新的问题:它将执行一个“拥有的”迭代,因此您将把obj本身移动到循环中

如果
objs
不是一个向量,那么以某种方式将其作为一个向量,因为切片无法分发拥有的对象。或者克隆所有对象,但我很怀疑这是你想要的。你的最后一个选择是将每个obj放在
Arc
中,如果你想变异它们,可能还需要一个
Mutex/RwLock

对于objs.iter()中的obj{

这意味着
obj
是一个
&T
移动
闭包意味着引用被移动到闭包中,但……就是这样。它是一个引用。这意味着被引用的类型必须是
同步
(由于stdlib线程没有限定作用域,所以编译器最终会告诉您引用的生存期不够长,因此您也会遇到生存期问题)

如果
objs
是一个向量,移除
.iter()
将解决这个问题,尽管它可能会触发新的问题:它将执行一个“拥有的”迭代,因此您将把obj本身移动到循环中


如果
objs
不是一个向量,那么以某种方式将其作为一个向量,因为切片无法分发拥有的对象。或者克隆所有对象,但我很怀疑这是你想要的。你的最后一个选择是将每个obj放在
Arc
中,如果你想变异它们,可能还需要一个
互斥锁/RwLock

这里有一个建议l为您节省大量时间:切换到,其发送方和接收方都是
Send
Sync
(它们也更高效,并且有更好的API)。以下建议将为您节省大量时间:切换到,其发送方和接收方都是
Send
Sync
。(它们的效率也更高,并且有一个经过深思熟虑的API。)