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