gpt4 book ai didi

rust - 为什么 Arc 和 Mutex 允许我更改不可变变量的值?

转载 作者:行者123 更新时间:2023-11-29 07:49:30 24 4
gpt4 key购买 nike

举个例子:

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);
}

cannot borrow immutable local variable v as mutable

我知道更改为 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;
});

playground

最佳答案

value.lock().unwrap()返回 MutexGuard 类型的值, 它有一个 DerefMut实现:

impl<'mutex, T: ?Sized> DerefMut for MutexGuard<'mutex, T> {
fn deref_mut(&mut self) -> &mut T { ... }
}

DerefMut::deref_mut(x)相当于&mut *x ;自然地,DerefMut也用于指针下的赋值,就像您的情况一样。

因此,对于*v += 1上类,v应该是 mut变量 - 否则 DerefMut::deref_mut 是不可能的完全被调用。

*value.lock().unwrap() += 1工作因为现在value.lock().unwrap()是没有显式绑定(bind)的临时变量,因此 Rust 可以自由地自动分配其可变性。

事实Mutex包含 UnsafeCell里面与关于DerefMut的这件事无关直接地;但是,这确实意味着 Mutex提供了一种称为内部可变性的东西,即它允许人们通过共享引用来改变其内容。您可以阅读更多信息 in the book .

关于rust - 为什么 Arc 和 Mutex 允许我更改不可变变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36773923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com