可以使用Arc和Mutex解决:
use std::sync::{Arc, Mutex};
struct MyStruct {}
impl MyStruct {
fn new() -> Self {
MyStruct {}
}
fn do_something(&self) {}
}
fn main() {
let my_struct = Arc::new(Mutex::new(MyStruct::new()));
let vec = vec![Arc::clone(&my_struct)];
for item in vec {
let my_struct = item.lock().unwrap();
my_struct.do_something();
}
}
在这个示例中,MyStruct包装在Arc中,并使用Mutex以线程安全的方式访问。Vec中包含的是Arc,因此可以在Vec之外使用它们,同时保持对MyStruct的共享所有权。在循环中,将每个Arc.lock()并unwrap()以获取MyStruct的所有权,然后执行do_something()方法。此代码不会引发编译器错误,因为每个锁将MyStruct限定在for循环的生命周期内。