pub struct Barrier { /* private fields */ }
Expand description
A barrier enables multiple threads to synchronize the beginning of some computation.
use tokio::sync::Barrier;
use futures::future::join_all;
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(async move {
println!("before wait");
let wr = c.wait().await;
println!("after wait");
wr
});
}
// Will not resolve until all "before wait" messages have been printed
let wrs = join_all(handles).await;
// Exactly one barrier will resolve as the "leader"
assert_eq!(wrs.into_iter().filter(|wr| wr.is_leader()).count(), 1);
Implementations
sourceimpl Barrier
impl Barrier
sourcepub fn new(n: usize) -> Barrier
pub fn new(n: usize) -> Barrier
Creates a new barrier that can block a given number of threads.
A barrier will block n
-1 threads which call Barrier::wait
and then wake up all
threads at once when the n
th thread calls wait
.
sourcepub async fn wait(&self) -> BarrierWaitResult
pub async fn wait(&self) -> BarrierWaitResult
Does not resolve until all tasks have rendezvoused here.
Barriers are re-usable after all threads 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 threads
will receive a result that will return false
from is_leader
.
Trait Implementations
Auto Trait Implementations
impl !RefUnwindSafe for Barrier
impl Send for Barrier
impl Sync for Barrier
impl Unpin for Barrier
impl !UnwindSafe for Barrier
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more