Rust解引用MutexGuard报错:Vec未实现Copy trait该如何解决?
错误本质
你尝试直接解引用MutexGuard并传值给do_an_action,相当于要把Mutex内部存储的Vec所有权直接移出守卫的作用域,这违反了Mutex的安全设计:所有对内部值的访问必须绑定MutexGuard的生命周期,守卫销毁时会自动解锁,Rust不允许把内部值的所有权从Mutex中直接转移走。
可行解决方案
方案1:修改函数签名为借用(推荐)
如果do_an_action不需要获取Vec的所有权,仅需要读取/修改内容,把参数改为对应引用类型即可:
只读场景
// 函数签名改为不可变借用 fn do_an_action(vec: &Vec<Option<Box<dyn CoolTrait>>>) { // 原有逻辑 } fn main() { let cool_vec: Vec<Option<Box<dyn CoolTrait>>> = vec![]; let vec_mx = Mutex::new(cool_vec); let mythread = thread::spawn(move || { let mxguard = vec_mx.lock().unwrap(); do_an_action(&*mxguard); // 传入借用即可 }); }
修改场景
// 函数签名改为可变借用 fn do_an_action(vec: &mut Vec<Option<Box<dyn CoolTrait>>>) { // 原有修改逻辑 } fn main() { let cool_vec: Vec<Option<Box<dyn CoolTrait>>> = vec![]; let vec_mx = Mutex::new(cool_vec); let mythread = thread::spawn(move || { let mut mxguard = vec_mx.lock().unwrap(); do_an_action(&mut *mxguard); // 传入可变借用 }); }
方案2:确需转移所有权时置换内部值
如果你确认后续不需要再使用这个Mutex存储内容,可以用std::mem::take把Vec从Mutex中置换出来:
use std::mem; fn main() { let cool_vec: Vec<Option<Box<dyn CoolTrait>>> = vec![]; let vec_mx = Mutex::new(cool_vec); let mythread = thread::spawn(move || { let mut mxguard = vec_mx.lock().unwrap(); // 把原Vec取出,Mutex中替换为空Vec let owned_vec = mem::take(&mut *mxguard); do_an_action(owned_vec); }); }
该操作完全合法,因为置换后Mutex依然持有一个合法的空Vec,不会产生不安全行为。
内容的提问来源于stack exchange,提问作者herpderp
相关产品推荐
相关产品推荐

