gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:22:37 29 4
gpt4 key购买 nike

我正在学习 Rust,但没有使用线程的经验。我正在学习 RuSTLings 类(class)并且已经解决了 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;
}
}
}

基于 Chapter 16.3 The Book 的,我预计需要分配给

*status_shared.jobs_completed

为了获取jobs_completed 字段,但这会产生错误:

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

书上给出的是指向简单类型的指针和上面的代码给出的是结构体的引用有区别吗?

最佳答案

status_shared 属于 MutexGuard 类型。 MutexGuard 实现了 DerefMutDeref特征,具有 T 的 deref 目标(存储在 Mutex 中的类型 - JobStatus 在您的情况下。

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

关于RuSTLings 线程练习,为什么我不取消引用 Mutex(Struct)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56624004/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com