现象:
编译没有问题,运行时出现:
代码:
pub fn do_test() {
let v = Arc::new(RefCell::new(100));
let v1 = v.try_borrow_mut().unwrap();
let v2 = v.try_borrow_mut().unwrap();
}
原因:
一个cell貌似不能同时被借用两次,注意!!,包含多线程。所以如果出现这类错,也要考虑是否有多线程的问题。
解决方案:
不要长期持有borrow_mut的句柄。如下例子就能正常执行:
struct MyData {
val:u32
}
pub fn do_test_1() {
let v: Arc<RefCell<MyData>> = Arc::new(RefCell::new(MyData {val:123}));
v.clone().try_borrow_mut().unwrap().val = 10; //直接赋值,不做句柄获取
v.clone().try_borrow_mut().unwrap().val = 12;
println!("result is {}",v.clone().try_borrow_mut().unwrap().val);
}
但是如果一直拿着borrow_mut的句柄,就会报错。接下来这个代码会运行报错:
pub fn do_test_2() {
let v: Arc<RefCell<MyData>> = Arc::new(RefCell::new(MyData {val:123}));
let temp1 = v.clone();
let mut v1 = temp1.try_borrow_mut().unwrap(); //长期借用...
v1.val = 111;
let temp2 = v.clone();
let mut v2 = temp2.try_borrow_mut().unwrap(); //这里再借用就会报错
v2.val = 222;
println!("result is {}",v.clone().try_borrow_mut().unwrap().val);
}