生成线程时无法共享 Arc 变量
Cannot share Arc variables when spawning threads
我有以下结构来表示服务器对象:
pub struct Server {
client_managers: Arc<ClientManager>,
listener: Option<TcpListener>,
}
这是接收客户端连接并在新线程中处理它的代码:
fn serve(&self) {
for stream in self.listener.as_ref().unwrap().incoming() {
match stream {
Ok(stream) => {
let client_manager = &mut self.client_managers.clone();
// let client_manager = Arc.new(self.client_managers);
thread::spawn(move || {
client_manager.do_something();
});
}
Err(e) => {
println!("connection error: {}", e);
}
}
}
}
但是,编译时出现以下错误:
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 的。 (Example)但为什么他们的例子有效而我的却不行?
2) 在我的情况下如何解决这个错误? (我还是要分享对象client_manager
)。
thread::spawn
采用闭包 'static
,这意味着它不能从线程外部借用数据。但是,这一行将克隆 Arc
并借用它,并将借用的引用传递给线程:
let client_manager = &mut self.client_managers.clone();
thread::spawn(move || {
client_manager.do_something();
// ^-- client_manager is a `&mut Arc<_>` borrowed from outside the thread
});
相反,您想要的只是克隆 Arc
,而不是在将其传递到线程之前以任何方式借用它:
let client_manager = self.client_managers.clone();
thread::spawn(move || {
client_manager.do_something();
// ^-- client_manager is a `Arc<_>` owned by the new thread
});
Arc
共享该值的所有权,因此它只会在所有指向它的 Arc
指针超出范围时被销毁,即使跨线程也是如此。
我有以下结构来表示服务器对象:
pub struct Server {
client_managers: Arc<ClientManager>,
listener: Option<TcpListener>,
}
这是接收客户端连接并在新线程中处理它的代码:
fn serve(&self) {
for stream in self.listener.as_ref().unwrap().incoming() {
match stream {
Ok(stream) => {
let client_manager = &mut self.client_managers.clone();
// let client_manager = Arc.new(self.client_managers);
thread::spawn(move || {
client_manager.do_something();
});
}
Err(e) => {
println!("connection error: {}", e);
}
}
}
}
但是,编译时出现以下错误:
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 的。 (Example)但为什么他们的例子有效而我的却不行?
2) 在我的情况下如何解决这个错误? (我还是要分享对象client_manager
)。
thread::spawn
采用闭包 'static
,这意味着它不能从线程外部借用数据。但是,这一行将克隆 Arc
并借用它,并将借用的引用传递给线程:
let client_manager = &mut self.client_managers.clone();
thread::spawn(move || {
client_manager.do_something();
// ^-- client_manager is a `&mut Arc<_>` borrowed from outside the thread
});
相反,您想要的只是克隆 Arc
,而不是在将其传递到线程之前以任何方式借用它:
let client_manager = self.client_managers.clone();
thread::spawn(move || {
client_manager.do_something();
// ^-- client_manager is a `Arc<_>` owned by the new thread
});
Arc
共享该值的所有权,因此它只会在所有指向它的 Arc
指针超出范围时被销毁,即使跨线程也是如此。