范围线程
常规线程不能从它们所处的环境中借用:
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 借用规则:你可以通过一个线程以可变的方式借用,也可以通过任意数量的线程以不可变的方式借用。