Потоки з областю видимості

Звичайні потоки не можуть запозичувати зі свого середовища:

use std::thread;

fn foo() {
    let s = String::from("Привіт");
    thread::spawn(|| {
        println!("Довжина: {}", s.len());
    });
}

fn main() {
    foo();
}

Однак для цього можна використовувати потік із обмеженою областю:

use std::thread;

fn main() {
    let s = String::from("Привіт");

    thread::scope(|scope| {
        scope.spawn(|| {
            println!("Довжина: {}", s.len());
        });
    });
}
This slide should take about 13 minutes.
  • Причина цього полягає в тому, що коли функція thread::scope завершується, усі потоки гарантовано об’єднуються, тому вони можуть повертати запозичені дані.
  • Застосовуються звичайні правила запозичення Rust: ви можете запозичувати або мутабельно одним потоком, або іммутабельно будь-якою кількістю потоків.