结构体设计
- 首先定义一个结构体来存储文件路径。
struct FilePath {
path: String,
}
- 定义一个包含工作线程数量及待处理文件路径列表的结构体。
struct FileProcessingSystem {
num_threads: usize,
file_paths: Vec<FilePath>,
}
线程间数据共享方案
- 使用
Arc
(原子引用计数)来共享数据,Mutex
(互斥锁)来保护共享数据。
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let system = FileProcessingSystem {
num_threads: 4,
file_paths: vec![
FilePath { path: "/path/to/file1".to_string() },
FilePath { path: "/path/to/file2".to_string() },
// 更多文件路径
],
};
let shared_paths = Arc::new(Mutex::new(system.file_paths));
let mut handles = Vec::new();
for _ in 0..system.num_threads {
let paths = Arc::clone(&shared_paths);
let handle = thread::spawn(move || {
let mut paths = paths.lock().unwrap();
while let Some(path) = paths.pop() {
// 处理文件路径
process_file(&path);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
fn process_file(path: &FilePath) {
// 实际的文件读取、修改等操作
println!("Processing file: {}", path.path);
}
避免数据竞争问题
- 使用
Mutex
:Mutex
确保在同一时间只有一个线程可以访问共享数据。在工作线程中,通过lock
方法获取锁,这将阻塞其他线程直到锁被释放。例如let mut paths = paths.lock().unwrap();
,如果其他线程正在持有锁,lock
调用会等待,直到锁可用。
- 所有权和借用规则:Rust的所有权和借用规则在编译时检查,防止在没有锁保护的情况下访问共享数据。例如,
Arc
克隆引用不会转移所有权,Mutex
内部的数据通过lock
方法返回的MutexGuard
来保证安全访问,在MutexGuard
生命周期结束时自动释放锁。
- 线程安全的数据结构:
Arc
和Mutex
都是线程安全的数据结构,Arc
用于在多个线程间共享数据,Mutex
用于保护共享数据的访问,两者结合使用保证了内存安全和高效的并发处理。