我正在学习并发编程,想要澄清我对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));
}
在代码行 let data = data.clone()
上发生了什么?《Rust编程之道》中提到:
新的 "owned handle" 是什么意思?听起来像是对数据的引用?我们使用
clone()
创建一个新的所有权句柄,然后将该句柄移动到新线程中。
由于
clone
接受一个 &self
并返回一个 Self
,因此每个线程是否修改原始数据而不是副本?我想这就是为什么这里没有使用 data.copy()
而是使用 data.clone()
的原因。右侧的
data
是一个引用,左侧的 data
是一个拥有的值。这里存在变量遮蔽。