范围线程
常规线程不能从它们所处的环境中借用:
use std::thread;
fn foo() {
let s = String::from("Hello");
thread::spawn(|| {
println!("Length: {}", s.len());
});
}
fn main() {
foo();
}
不过,你可以使用范围线程来实现此目的:
use std::thread;
fn main() {
let s = String::from("Hello");
thread::scope(|scope| {
scope.spawn(|| {
println!("Length: {}", s.len());
});
});
}
- 其原因在于,在
thread::scope
函数完成后,可保证所有线程都已联结在一起,使得线程能够返回借用的数据。 - 此时须遵守常规 Rust 借用规则:你可以通过一个线程以可变的方式借用,也可以通过任意数量的线程以不可变的方式借用。