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
ScopedJoinHandlefor it.Unlike non-scoped threads, threads spawned with this function may borrow non-
'staticdata from outside the scope. Seescopefor details.The join handle provides a
joinmethod that can be used to join the spawned thread. If the spawned thread panics,joinwill return anErrcontaining 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,
scopewill 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, useBuilder::spawn_scoped.Panics
Panics if the OS fails to create a thread; use
Builder::spawn_scopedto 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) -> TReturns the argument unchanged.
impl<T> SizeHint for Scope<'scope, 'env>
where
T: ?Sized,
fn lower_bound(&self) -> usizefn 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) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses 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>