我正在尝试找到一种方法,用于在不同线程中锁定文件的写入。正确的方式是什么? 我不想因为性能问题每次需要写入时都打开和关闭文件。
我尝试过的代码如下:
use std::{fs, mem, thread};
use std::os::unix::prelude::FileExt;
use std::sync::{Arc, Mutex};
const COUNT: usize = 1000;
fn main() {
let file: fs::File = fs::File::create("foo.txt").unwrap();
let v: [u32; COUNT] = [6; COUNT];
let counter = Arc::new(Mutex::new(0));
let mut threads = Vec::new();
for _ in 0..COUNT {
let counter = Arc::clone(&counter);
let thread = thread::spawn(move || {
let mut i = counter.lock().unwrap();
let offset = (mem::size_of::<u32>() * (*i)) as u64;
let bytes = unsafe { mem::transmute::<u32, [u8; 4]>(v[*i]) };
file.write_all_at(&bytes, offset).unwrap();
*i += 1;
});
threads.push(thread);
}
for thread in threads {
thread.join().unwrap();
}
}
这会导致错误:
move occurs because `file` has type `std::fs::File`, which does not implement the `Copy` trait
据我理解,文件对象在线程之间无法轻松共享。我猜想,在处理此问题的整个方法方面,我可能做错了什么。那么,在Rust中从不同的线程写入文件的正确方式是什么?
counter
一样为file
创建另一个Arc<Mutex>
即可。 - Aplet123Vec<u8>
,然后可变地借用线程所需的部分,并最终使用file.write_all(&vec)
写入文件。 - vallentin