Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

Обычные потоки не могут заимствовать из своего окружения:

// 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: либо один поток может заимствовать изменяемо, либо любое число потоков может заимствовать неизменяемо.