Я изучаю concurrency и хочу пояснить свое понимание следующего примера из книги 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()?
В книге Руста
мы используем
clone()для создания нового дескриптора. Затем этот дескриптор перемещается в новый поток.
Что такое новый "владеющий дескриптор"? Это похоже на ссылку на данные?
Так как clone принимает &self и возвращает a Self, каждый поток изменяет исходные данные вместо копии? Я думаю, поэтому код не использует data.copy(), но data.clone() здесь.
data с правой стороны является ссылкой, а data слева является принадлежащим ему значением. Здесь есть переменная тень.