【问题标题】:Sharing between threads with mpsc::Sender and mpsc::Receiver使用 mpsc::Sender 和 mpsc::Receiver 在线程之间共享
【发布时间】:2021-07-09 18:51:41
【问题描述】:

我查看了this 的帖子,但不知道我的代码哪里出了问题。我有一个结构向量,每个结构都包含一个mpsc::Sendermpsc::Receiver,我正在尝试将这些结构中的每一个移动到一个线程中并不断收到此编译错误(以及发送方的对称错误)。由于 Sender 和 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();
    ...
  });
  ...
}

【问题讨论】:

  • 这里有一个可以为您节省大量时间的建议:切换到crossbeam-channel,其发送者和接收者都是SendSync。 (它们的效率也更高,并且拥有经过深思熟虑的 API。)

标签: multithreading rust channel


【解决方案1】:

对于 objs.iter() 中的 obj {

这意味着obj&amp;Tmove 闭包意味着引用被移动到闭包中,但是……就是这样。这是一个参考。意味着被引用的类型必须是Sync(而且你会遇到生命周期问题,因为stdlib线程不是作用域,所以编译器最终会告诉你引用的寿命不够长) .

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

如果objs 不是向量,则以某种方式使其成为向量,因为切片无法分发拥有的对象。或者克隆所有东西,但我怀疑这就是你想要的。您的最终选择是将每个 obj 放入 Arc 中,如果您想改变它们,也可能放入 Mutex/RwLock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2015-10-23
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多