Struct WaitGroup

pub struct WaitGroup { /* private fields */ }

Enables threads to synchronize the beginning or end of some computation.

Wait groups vs barriers

WaitGroup is very similar to Barrier, but there are a few differences:

Examples

use crossbeam_utils::sync::WaitGroup;
use std::thread;

// Create a new wait group.
let wg = WaitGroup::new();

for _ in 0..4 {
    // Create another reference to the wait group.
    let wg = wg.clone();

    thread::spawn(move || {
        // Do some work.

        // Drop the reference to the wait group.
        drop(wg);
    });
}

// Block until all threads have finished their work.
wg.wait();
# std::thread::sleep(std::time::Duration::from_millis(500)); // wait for background threads closed: https://github.com/rust-lang/miri/issues/1371

Implementations

impl WaitGroup

fn new() -> Self

Creates a new wait group and returns the single reference to it.

Examples

use crossbeam_utils::sync::WaitGroup;

let wg = WaitGroup::new();
fn wait(self)

Drops this reference and waits until all other references are dropped.

Examples

use crossbeam_utils::sync::WaitGroup;
use std::thread;

let wg = WaitGroup::new();

thread::spawn({
    let wg = wg.clone();
    move || {
        // Block until both threads have reached `wait()`.
        wg.wait();
    }
});

// Block until both threads have reached `wait()`.
wg.wait();
# std::thread::sleep(std::time::Duration::from_millis(500)); // wait for background threads closed: https://github.com/rust-lang/miri/issues/1371

Trait Implementations

impl Clone for WaitGroup

fn clone(&self) -> Self

impl Debug for WaitGroup

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

impl Default for WaitGroup

fn default() -> Self

impl Drop for WaitGroup

fn drop(&mut self)

Auto Trait Implementations

impl Freeze for WaitGroup

impl RefUnwindSafe for WaitGroup

impl Send for WaitGroup

impl Sync for WaitGroup

impl Unpin for WaitGroup

impl UnsafeUnpin for WaitGroup

impl UnwindSafe for WaitGroup

Blanket Implementations

impl<T> Any for WaitGroup where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for WaitGroup where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for WaitGroup where T: ?Sized,

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

impl<T> CloneToUninit for WaitGroup where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for WaitGroup

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for WaitGroup where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T, U> Into<U> for WaitGroup 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 WaitGroup where U: Into<T>,

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

impl<T, U> TryInto<U> for WaitGroup where U: TryFrom<T>,

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