Struct Barrier

pub struct Barrier { /* private fields */ }

A barrier enables multiple tasks to synchronize the beginning of some computation.

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
use tokio::sync::Barrier;
use std::sync::Arc;

let mut handles = Vec::with_capacity(10);
let barrier = Arc::new(Barrier::new(10));
for _ in 0..10 {
    let c = barrier.clone();
    // The same messages will be printed together.
    // You will NOT see any interleaving.
    handles.push(tokio::spawn(async move {
        println!("before wait");
        let wait_result = c.wait().await;
        println!("after wait");
        wait_result
    }));
}

// Will not resolve until all "after wait" messages have been printed
let mut num_leaders = 0;
for handle in handles {
    let wait_result = handle.await.unwrap();
    if wait_result.is_leader() {
        num_leaders += 1;
    }
}

// Exactly one barrier will resolve as the "leader"
assert_eq!(num_leaders, 1);
# }

Implementations

impl Barrier

fn new(n: usize) -> Barrier

Creates a new barrier that can block a given number of tasks.

A barrier will block n-1 tasks which call Barrier::wait and then wake up all tasks at once when the nth task calls wait.

async fn wait(&self) -> BarrierWaitResult

Does not resolve until all tasks have rendezvoused here.

Barriers are re-usable after all tasks have rendezvoused once, and can be used continuously.

A single (arbitrary) future will receive a BarrierWaitResult that returns true from BarrierWaitResult::is_leader when returning from this function, and all other tasks will receive a result that will return false from is_leader.

Cancel safety

This method is not cancel safe.

Trait Implementations

impl Debug for Barrier

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

Auto Trait Implementations

impl !Freeze for Barrier

impl !RefUnwindSafe for Barrier

impl !UnwindSafe for Barrier

impl Send for Barrier

impl Sync for Barrier

impl Unpin for Barrier

impl UnsafeUnpin for Barrier

Blanket Implementations

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

fn type_id(&self) -> TypeId

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

fn borrow(&self) -> &T

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

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

impl<T> From<T> for Barrier

fn from(t: T) -> T

Returns the argument unchanged.

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

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

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

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