范围线程

常规线程不能从它们所处的环境中借用:

  1. use std::thread;
  2. fn foo() {
  3. let s = String::from("Hello");
  4. thread::spawn(|| {
  5. println!("Length: {}", s.len());
  6. });
  7. }
  8. fn main() {
  9. foo();
  10. }

不过,你可以使用范围线程来实现此目的:

  1. use std::thread;
  2. fn main() {
  3. let s = String::from("Hello");
  4. thread::scope(|scope| {
  5. scope.spawn(|| {
  6. println!("Length: {}", s.len());
  7. });
  8. });
  9. }
  • 其原因在于,在 thread::scope 函数完成后,可保证所有线程都已联结在一起,使得线程能够返回借用的数据。
  • 此时须遵守常规 Rust 借用规则:你可以通过一个线程以可变的方式借用,也可以通过任意数量的线程以不可变的方式借用。