尝试通过以下方式获取对单独字段的可变引用MutexGuard
:
struct MyObject {
pub a: i32,
pub b: i32,
}
fn func_1(mtx: &Mutex<MyObject>) {
let mut obj = mtx.lock().unwrap();
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
结果出现错误:
error[E0499]: cannot borrow `obj` as mutable more than once at a time
--> src/main.rs:11:18
|
10 | let a = &mut obj.a;
| --- first mutable borrow occurs here
11 | let b = &mut obj.b;
| ^^^ second mutable borrow occurs here
12 |
13 | *a += 1;
| ------- first borrow later used here
这让我有点困惑。这适用于当obj
是一个简单的可变引用(&mut MyObject
)。我想也许Deref
特质是导致问题的原因,但如果obj
is a &mut Box<MyObject>
.
请参阅.
我缺少什么?
Mutex::lock 返回一个 RAII 锁防护以及处理其所包含值的方法。得到它包含的值&mut
(以及随后的“分割借用”),您需要:
- 拯救守卫(由
lock
)在一个单独的值中,因为只要访问该值,锁就需要存在。
- 将值提取为
&mut
从守卫与MutexGuard::deref_mut
.
这是更新的func_1
:
use std::ops::DerefMut;
fn func_1(mtx: &Mutex<MyObject>) {
let mut guard = mtx.lock().unwrap();
let obj = guard.deref_mut();
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)