use std::sync::{Arc, Mutex};
use std::thread;
// 定义包含进度、任务描述和时间戳的结构体
struct ProgressReport {
progress: u32,
task_description: String,
timestamp: String,
}
fn main() {
// 使用Arc和Mutex来实现线程安全
let shared_report = Arc::new(Mutex::new(ProgressReport {
progress: 0,
task_description: "Initial task".to_string(),
timestamp: "00:00:00".to_string(),
}));
let mut handles = vec![];
for _ in 0..10 {
let report_clone = shared_report.clone();
let handle = thread::spawn(move || {
// 锁定Mutex以安全访问和修改结构体
let mut report = report_clone.lock().unwrap();
report.progress += 1;
report.task_description = "Updated task".to_string();
report.timestamp = "01:00:00".to_string();
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终的进度报告
let final_report = shared_report.lock().unwrap();
println!("Final Progress: {}", final_report.progress);
println!("Final Task Description: {}", final_report.task_description);
println!("Final Timestamp: {}", final_report.timestamp);
}
关键部分实现逻辑解释
Arc
(原子引用计数指针): Arc
用于在多个线程间共享数据,它提供原子引用计数操作,确保数据在所有引用都被释放时才会被销毁,从而保证内存安全。
Mutex
(互斥锁): Mutex
是一种同步原语,用于保护共享数据,确保同一时间只有一个线程可以访问数据。在Rust中,Mutex
使用 lock
方法来获取锁,这会返回一个 MutexGuard
,它在作用域结束时自动释放锁,从而保证数据的完整性和线程安全。
- 线程安全的结构体更新: 在每个线程中,通过调用
lock
方法获取 MutexGuard
,从而安全地更新 ProgressReport
结构体的各个字段。这确保了在多线程环境下,对结构体的修改不会导致数据竞争,从而保证了整个结构体的完整性和线程安全。