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
的参数) 开始之前。