Function std::thread::scope
pub fn scope<'env, F, T>(f: F) -> T where F: for<'scope> FnOnce(&'scope Scope<'scope, 'env>) -> T,
创建一个范围,用于催生范围内的线程。
传递给
scope
的函数将提供一个
Scope
对象,通过它可以
产生
作用域线程。
与非作用域线程不同,作用域线程可以借用非
'static
数据,因为作用域保证所有线程都将在作用域的末尾加入。
在这个范围内产生的所有线程,如果没有被手动加入,将在这个函数返回之前被自动加入。
Panics
如果任何一个自动加入的线程惊慌失措,这个函数将惊慌失措。
如果您想处理衍生线程的恐慌,请在范围结束之前
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");
dbg!(&a);
s.spawn(|| {
println!("hello from the second scoped thread");
x += a[0] + a[2];
println!("hello from the main thread");
a.push(4);
assert_eq!(x, a.len());
Lifetimes
作用域线程涉及两个生命周期:
'scope
和
'env
。
'scope
生命周期表示范围本身的生命周期。即:可能产生新作用域线程的时间,以及它们可能仍在运行的时间。一旦此生命周期结束,所有作用域线程都将加入。这个生命周期在
scope
函数内开始,在
f
(
scope
的参数)开始之前。它在
f
返回并且所有作用域线程都已加入但在
scope
返回之前结束。
'env
生命周期表示作用域线程借用的任何内容的生命周期。
scope
的调用更持久,因此不能小于
'scope
. 它可以像对
scope
的调用一样小,这意味着任何超出此调用的时间,例如在作用域之前定义的局部变量,都可以被作用域线程借用。
'env: 'scope
绑定是
Scope
类型定义的一部分。