Я изучаю Rust и не имею опыта работы с потоками.Я прохожу курс Rustlings и выполнил упражнение threads1.rs
, но я не понимаю, почему моя структура Mutex
не нуждается в разыменовании.
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
struct JobStatus {
jobs_completed: u32,
}
fn main() {
let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
let status_shared = Arc::clone(&status);
thread::spawn(move || {
for _ in 0..10 {
thread::sleep(Duration::from_millis(250));
let mut status_shared = status_shared.lock().unwrap();
status_shared.jobs_completed += 1; // why not *status_shared?
}
});
let mut jobs_completed: u32;
loop {
jobs_completed = status.lock().unwrap().jobs_completed;
if jobs_completed < 10 {
println!("waiting... ({} jobs done)", jobs_completed);
thread::sleep(Duration::from_millis(500));
} else {
break;
}
}
}
На основе Глава 16.3 Книги, я бы ожидал, что потребуется присвоить
*status_shared.jobs_completed
, чтобы получить для поля jobs_completed
, но это генерируетошибка:
error[E0614]: type `u32` cannot be dereferenced
--> src/main.rs:16:13
|
16 | *status_shared.jobs_completed += 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Разница в том, что книга дает указатель на простой тип, а вышеприведенный код дает ссылку на структуру?