Я изучаю 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
слева является принадлежащим ему значением. Здесь есть переменная тень.