Я бы хотел лучше понять семантику следующего кода Rust:
use std::thread;
fn main() {
let immutable = "I am not mutable";
let mut mutable = "I am mutable";
let handle1 = thread::spawn(move || {
println!("Thread 1 says: {}", immutable);
});
let handle2 = thread::spawn(move || {
println!("Thread 2 says: {}", immutable);
});
let handle3 = thread::spawn(move || {
println!("Thread 3 says: {}", mutable);
mutable = "go away";
});
let handle4 = thread::spawn(move || {
println!("Thread 4 says: {}", mutable);
});
handle1.join().unwrap();
handle2.join().unwrap();
}
Я не понимаю, почему этот код компилируется.Я поделился переменной mutable
между несколькими потоками и даже мутировал.Что именно происходит за кадром с памятью здесь?Делаем ли мы несколько указателей на одну и ту же строку в статической памяти?Мы помещаем две разные статические строки в память?Меня не удивляет тот факт, что у меня два потока читают из одного неизменного элемента, но наличие двух потоков, считывающих изменяемую переменную, делает это.
Обратите внимание, что даже если поток 3 запускается до 4, 4 не работаетотражает обновленную строку, которую поток 3 устанавливает в своем операторе println!
.Наконец, поскольку я не передал использование &immutable
, означает ли это, что значение «перемещается» в каждый поток, а не в адрес реальной памяти?