gpt4 book ai didi

rust - 令人困惑的 Arc 自动取消引用

转载 作者:行者123 更新时间:2023-11-29 08:10:05 25 4
gpt4 key购买 nike

这是取自 Mutex documentation 的示例:

use std::sync::{Arc, Mutex};
use std::sync::mpsc::channel;
use std::thread;

const N: usize = 10;
fn main() {
let data = Arc::new(Mutex::new(0));
let (tx,rx) = channel();
for _ in 0..N{
let (data, tx) = (data.clone(), tx.clone());
thread::spawn(move || {
// snippet
});
}
rx.recv().unwrap();
}

我的问题是 snippet 在哪里评论是。它被给出为

let mut data = data.lock().unwrap();
*data += 1;
if *data == N {
tx.send(()).unwrap();
}

数据类型为Arc<Mutex<usize>> , 所以当调用 data.lock() ,我假设 Arc正在被自动取消引用并且 usize分配给 data .为什么我们需要 *data 前再次取消引用它?

以下代码首先取消引用 Arc然后继续进行 usize也可以代替代码片段。

let mut data = *data.lock().unwrap();
data += 1;
if data == N {
tx.send(()).unwrap();
}

最佳答案

遵循文档。以 Arc<T> 开头:

  • 是否Arc::lock存在?编号查询Deref .
  • Deref::TargetT .检查 Mutex<T> .
  • 是否Mutex::lock存在? Yes .它返回 LockResult<MutexGuard<T>> .
  • unwrap 在哪里来自? LockResult<T> Result<T, PoisonError<T>> 的同义词.所以它是Result::unwrap ,结果是 MutexGuard<T> .
  • 因此,data类型为 MutexGuard<usize> .

所以这是错误的:

so when calling data.lock(), I assumed that the Arc is being automatically dereferenced and an usize is assigned to data.

因此问题不是为什么不能直接赋值,而是如何赋值 usize值(value)根本。再次,按照文档:

  • dataMutexGuard<usize> , 所以检查 MutexGuard<T> .
  • *data是需要突变的上下文中的指针取消引用。寻找 DerefMut 的实现.
  • 上面写着 MutexGuard<T> , 它实现了 DerefMut::deref_mut(&mut self) -> &mut T .
  • 因此,*data 的结果是&mut usize .

然后我们有你修改的例子。在这一点上,应该清楚这根本不是在做同样的事情:它正在改变一个恰好包含与互斥锁相同值的局部变量。但是因为它是一个局部变量,所以改变它绝对不会影响互斥体的内容。


因此,简短的版本是:锁定互斥锁的结果是一个包裹实际值的“智能指针”,而不是值本身。因此,您必须取消引用它才能访问该值。

关于rust - 令人困惑的 Arc 自动取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46314582/

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