拿這個例子:爲什麼Arc和Mutex允許我改變一個不可變變量的值?
fn main() {
let dato = std::sync::Arc::new(std::sync::Mutex::new(1u8));
for _ in 0..3 {
let value = dato.clone();
std::thread::spawn(move || {
let v = value.lock().unwrap();
*v += 1; // <- Error
});
}
std::thread::sleep(std::time::Duration::from_secs(1u64));
println!("{:?}", dato);
}
不能借用一成不變的局部變量
v
作爲可變
我知道,改變爲mut
作品:
std::thread::spawn(move || {
let mut v = value.lock().unwrap();
*v += 1;
});
但爲什麼這項工作:
let value = dato.clone();
std::thread::spawn(move || {
*value.lock().unwrap() += 1;
});
更新:我看了,我認爲它與在互斥體內使用std :: cell - > UnsafeCell https://doc.rust-lang.org/core/cell/struct.UnsafeCell.html但我不知道這是不是真的。 –