<分区>
我正在尝试获取一个大字符串或数据并将其分解成多个片段以跨多个线程进行处理。我想利用多线程来帮助处理数据,但希望避免复制数据。
这是问题的一个例子。 Segment0 可以工作,因为它通过副本拥有数据。 Segment1 只是借用数据并会导致问题,即使连接保证了生命周期的正确性。
use std::thread;
use std::fs;
use std::sync::{Arc};
fn main() {
let data = fs::read("./test.txt").unwrap();
let segment_size = data.len()/2;
let segment0 = &data[0..segment_size]; //Borrow data no copy
let segment1 = &data[segment_size..]; //Borrow data no copy
let segment0 = Vec::from(segment0); //has ownership of data through copy
let thread0 = thread::spawn(move || println!("Thread 0 {:?}",std::str::from_utf8(&segment0)));
let thread1 = thread::spawn(move || println!("Thread 1 {:?}",std::str::from_utf8(segment1)));
thread0.join(); //thread 0 terminated segment0 dropped
thread1.join(); //thread 1 terminated segment1 dropped
//data released segment0 and segment1 needed to be dropped before
}
返回的错误
error[E0597]: `data` does not live long enough
--> src/main.rs:10:25
|
10 | let segment1 = &data[segment_size..]; //Borrow data no copy
| ^^^^ borrowed value does not live long enough
...
21 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...