Function std::thread::scope

1.63.0 · source ·
pub fn scope<'env, F, T>(f: F) -> Twhere
    F: for<'scope> FnOnce(&'scope Scope<'scope, 'env>) -> T,
Expand description

创建一个生成作用域线程的作用域。

传递给 scope 的函数将提供一个 Scope 对象,通过该对象可以 生成 作用域线程。

与非作用域线程不同,作用域线程可以借用非 'static 的数据,因为作用域保证所有线程都将在作用域的末尾加入。

在此函数返回之前,在作用域内生成的所有未手动加入的线程将自动加入。

Panics

如果任何自动加入的线程发生 panic,则这个函数也会出现 panic。

如果您想处理衍生线程的 panic,请在作用域结束之前 join 它们。

Example

use std::thread;

let mut a = vec![1, 2, 3];
let mut x = 0;

thread::scope(|s| {
    s.spawn(|| {
        println!("hello from the first scoped thread");
        // 我们可以在这里借用 `a`。
        dbg!(&a);
    });
    s.spawn(|| {
        println!("hello from the second scoped thread");
        // 我们甚至可以在这里可变地借用 `x`,因为没有其他线程在使用它。
        x += a[0] + a[2];
    });
    println!("hello from the main thread");
});

// 在作用域之后,我们可以再次修改和访问我们的变量:
a.push(4);
assert_eq!(x, a.len());
Run

Lifetimes

Scoped 线程涉及两个生命周期: 'scope'env

'scope 生命周期代表作用域本身的生命周期。 即: 可能产生新作用域线程的时间,以及它们可能仍在运行的时间。 一旦这个生命周期结束,所有作用域的线程都会加入。 这个生命周期在 scope 函数中开始,在 f (scope 的参数) 开始之前。 它在 f 返回并且所有作用域线程都已加入之后但在 scope 返回之前结束。

'env 生命周期表示作用域线程所借用的生命周期。 这个生命周期必须比调用到 scope 的时间长,因此不能小于 'scope。 它可以像调用到 scope 一样小,这意味着任何超过这个调用的东西,例如在作用域之前定义的局部变量,都可以被作用域线程借用。

'env: 'scope 界限是 Scope 类型定义的一部分。