Потоки с областью видимости
Обычные потоки не могут заимствовать из своего окружения:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::thread;
fn foo() {
let s = String::from("Hello");
thread::spawn(|| {
dbg!(s.len());
});
}
fn main() {
foo();
}
Однако для этого можно использовать область видимости потока (scoped thread):
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::thread;
fn foo() {
let s = String::from("Hello");
thread::scope(|scope| {
scope.spawn(|| {
dbg!(s.len());
});
});
}
fn main() {
foo();
}
This slide should take about 13 minutes.
- Причина в том, что когда функция
thread::scopeзавершается, все потоки гарантированно присоединены (joined), поэтому они могут возвращать заимствованные данные. - Действуют обычные правила заимствования Rust: либо один поток может заимствовать изменяемо, либо любое число потоков может заимствовать неизменяемо.