Multithreading 生成线程时无法共享Arc变量

Multithreading 生成线程时无法共享Arc变量,multithreading,rust,ownership,Multithreading,Rust,Ownership,我使用以下结构来表示服务器对象: pub struct Server { client_managers: Arc<ClientManager>, listener: Option<TcpListener>, } 但是,我在编译时遇到以下错误: error[E0716]: temporary value dropped while borrowed --> server/src/server.rs:37:47 | 37 |

我使用以下结构来表示服务器对象:

pub struct Server {
    client_managers: Arc<ClientManager>,
    listener: Option<TcpListener>,
}
但是,我在编译时遇到以下错误:

error[E0716]: temporary value dropped while borrowed
  --> server/src/server.rs:37:47
   |
37 |                       let client_manager = &mut self.client_managers.clone();
   |                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
38 |                       // let client_manager = Arc.new(self.client_managers);
39 | /                     thread::spawn(move || {
40 | |                         client_manager.nothing();
41 | |                     });
   | |______________________- argument requires that borrow lasts for `'static`
42 |                   }
   |                   - temporary value is freed at the end of this statement
我明白为什么会发生这个错误。我的问题是:

1) 我通过在线学习一些教程来使用Arc。()但为什么他们的例子有效,而我的却不行


2) 在我的情况下,如何修复此错误?(我仍然希望共享对象
客户机\u管理器
)。

线程::spawn
接受一个
静态的闭包,这意味着它无法从线程外部借用数据。但是,此行将克隆
并借用它,并将借用的引用传递到线程中:

let client_manager=&mut self.client_managers.clone();
线程::生成(移动| |{
客户经理。做点什么();
//^--客户端管理器是从线程外部借用的`&mut Arc`
});
相反,您需要的是只克隆
,而不是在其传递到线程之前以任何方式借用它:

让client_manager=self.client_managers.clone();
线程::生成(移动| |{
客户经理。做点什么();
//^--客户机_管理器是新线程拥有的“Arc”
});

Arc
对该值拥有共享所有权,因此只有在引用它的所有
Arc
指针超出范围时,它才会被销毁,即使跨线程也是如此。

thread::spawn
接受一个
静态的闭包,这意味着它无法从线程外部借用数据。但是,此行将克隆
并借用它,并将借用的引用传递到线程中:

let client_manager=&mut self.client_managers.clone();
线程::生成(移动| |{
客户经理。做点什么();
//^--客户端管理器是从线程外部借用的`&mut Arc`
});
相反,您需要的是只克隆
,而不是在其传递到线程之前以任何方式借用它:

让client_manager=self.client_managers.clone();
线程::生成(移动| |{
客户经理。做点什么();
//^--客户机_管理器是新线程拥有的“Arc”
});

Arc
对该值拥有共享所有权,因此只有在引用它的所有
Arc
指针超出范围时,它才会被销毁,即使在线程之间也是如此。

请更新您的问题以包含一个值。当我试着调试它时,我得到了一堆关于丢失类型的错误消息,我不知道如何修复它们,所以我放弃了。但我猜是
&mut
——为什么会这样?我只需编写
让client\u manager=self.client\u managers.clone()它是一个
,因此它已经是一个参考;看来没有必要再做一个了。@trentcl谢谢。您的建议很有效,我在更仔细地阅读了Rust文档后理解了。我保证下次我会提供可行的代码。请更新您的问题以包含一个。当我试着调试它时,我得到了一堆关于丢失类型的错误消息,我不知道如何修复它们,所以我放弃了。但我猜是
&mut
——为什么会这样?我只需编写
让client\u manager=self.client\u managers.clone()它是一个
,因此它已经是一个参考;看来没有必要再做一个了。@trentcl谢谢。您的建议很有效,我在更仔细地阅读了Rust文档后理解了。我保证下次我会提供可行的代码。
error[E0716]: temporary value dropped while borrowed
  --> server/src/server.rs:37:47
   |
37 |                       let client_manager = &mut self.client_managers.clone();
   |                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
38 |                       // let client_manager = Arc.new(self.client_managers);
39 | /                     thread::spawn(move || {
40 | |                         client_manager.nothing();
41 | |                     });
   | |______________________- argument requires that borrow lasts for `'static`
42 |                   }
   |                   - temporary value is freed at the end of this statement