Struct Scope

pub struct Scope<'scope, 'env: 'scope> { pub(in ::thread::scoped) data: Arc<ScopeData>, pub(in ::thread::scoped) scope: PhantomData<&'scope mut &'scope ()>, pub(in ::thread::scoped) env: PhantomData<&'env mut &'env ()> }

A scope to spawn scoped threads in.

See scope for details.

Fields

data: Arc<ScopeData>
scope: PhantomData<&'scope mut &'scope ()>

Invariance over 'scope, to make sure 'scope cannot shrink, which is necessary for soundness.

Without invariance, this would compile fine but be unsound:

std::thread::scope(|s| {
    s.spawn(|| {
        let a = String::from("abcd");
        s.spawn(|| println!("{a:?}")); // might run after `a` is dropped
    });
});
env: PhantomData<&'env mut &'env ()>

Implementations

impl<'scope, 'env> Scope<'scope, 'env>

fn spawn<F, T>(&'scope self, f: F) -> ScopedJoinHandle<'scope, T>
where
    F: FnOnce() -> T + Send + 'scope,
    T: Send + 'scope,

Spawns a new thread within a scope, returning a ScopedJoinHandle for it.

Unlike non-scoped threads, threads spawned with this function may borrow non-'static data from outside the scope. See scope for details.

The join handle provides a join method that can be used to join the spawned thread. If the spawned thread panics, join will return an Err containing the panic payload.

If the join handle is dropped, the spawned thread will be implicitly joined at the end of the scope. In that case, if the spawned thread panics, scope will panic after all threads are joined.

This function creates a thread with the default parameters of Builder. To specify the new thread's stack size or the name, use Builder::spawn_scoped.

Panics

Panics if the OS fails to create a thread; use Builder::spawn_scoped to recover from such errors.

Trait Implementations

impl Debug for Scope<'_, '_>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Auto Trait Implementations

impl<'scope, 'env> !UnwindSafe for Scope<'scope, 'env>

impl<'scope, 'env> Freeze for Scope<'scope, 'env>

impl<'scope, 'env> RefUnwindSafe for Scope<'scope, 'env>

impl<'scope, 'env> Send for Scope<'scope, 'env>

impl<'scope, 'env> Sync for Scope<'scope, 'env>

impl<'scope, 'env> Unpin for Scope<'scope, 'env>

impl<'scope, 'env> UnsafeUnpin for Scope<'scope, 'env>

Blanket Implementations

impl<T> Any for Scope<'scope, 'env> where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Scope<'scope, 'env> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Scope<'scope, 'env> where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> From<T> for Scope<'scope, 'env>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> SizeHint for Scope<'scope, 'env> where T: ?Sized,

fn lower_bound(&self) -> usize
fn upper_bound(&self) -> Option<usize>

impl<T> SizedTypeProperties for Scope<'scope, 'env>

impl<T, U> Into<U> for Scope<'scope, 'env> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Scope<'scope, 'env> where U: Into<T>,

type Error = Infallible;
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto<U> for Scope<'scope, 'env> where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>