Потоки з областю видимості
Звичайні потоки не можуть запозичувати зі свого середовища:
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: ви можете запозичувати або мутабельно одним потоком, або іммутабельно будь-якою кількістю потоків.