我正在学习并发性,并希望澄清我对Rust书中以下代码示例的理解.如果我错了,请纠正我.
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
fn main() {
let data = Arc::new(Mutex::new(vec![1, 2, 3]));
for i in 0..3 {
let data = data.clone();
thread::spawn(move || {
let mut data = data.lock().unwrap();
data[0] += i;
});
}
thread::sleep(Duration::from_millis(50));
}
Run Code Online (Sandbox Code Playgroud)
线路上发生了let data = data.clone()什么?
Rust书说
我们
clone()用来创建一个新拥有的句柄.然后将此句柄移动到新线程中.
什么是新的"拥有的手柄"?这听起来像是对数据的引用?
由于clonea &self和a 返回一个Self,是每个线程修改原始数据而不是副本?我猜这就是为什么代码没有使用data.copy()但data.clone()在这里.
在data右侧是一个参考,而data左边是一个拥有价值.这里有一个变量阴影.
有人可以向我解释为什么Rc<>不是Copy吗?
我正在编写使用大量共享指针的代码,并且不得不一直打字,.clone()这让我很紧张.
在我看来,Rc<>应该只是一个指针,这是一个固定的大小,所以类型本身应该是Sized,因此Copy,对吗?
我错过了什么吗?