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());
RunLifetimes
Scoped 线程涉及两个生命周期: 'scope
和 'env
。
'scope
生命周期代表作用域本身的生命周期。
即: 可能产生新作用域线程的时间,以及它们可能仍在运行的时间。
一旦这个生命周期结束,所有作用域的线程都会加入。
这个生命周期在 scope
函数中开始,在 f
(scope
的参数) 开始之前。
它在 f
返回并且所有作用域线程都已加入之后但在 scope
返回之前结束。
'env
生命周期表示作用域线程所借用的生命周期。
这个生命周期必须比调用到 scope
的时间长,因此不能小于 'scope
。
它可以像调用到 scope
一样小,这意味着任何超过这个调用的东西,例如在作用域之前定义的局部变量,都可以被作用域线程借用。
'env: 'scope
界限是 Scope
类型定义的一部分。