Rustlings 线程练习,为什么我不取消引用 Mutex(Struct)?

Chr*_*ffi 2 dereference rust

我正在学习 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据本书的第 16.3 章,我原以为需要分配给

*status_shared.jobs_completed
Run Code Online (Sandbox Code Playgroud)

为了获得jobs_completed领域,但生成错误:

error[E0614]: type `u32` cannot be dereferenced
  --> src/main.rs:16:13
   |
16 |             *status_shared.jobs_completed += 1;
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

这本书给出了一个简单类型的指针和上面的代码给出了一个结构体的引用有区别吗?

Mat*_*247 5

status_shared是 类型MutexGuardMutexGuard实现DerefMutDeref特征,其 deref 目标为T(存储在互斥锁中的类型 -JobStatus在您的情况下。

当你.在一个对象的背后使用时,rust 编译器会自动尝试将它解引用到可以执行请求的操作的地方。因此,这里不需要显式取消引用。这种行为在 Rust 书中的Deref 章节中有所描述