pub struct Barrier {
state: Mutex<BarrierState>,
wait: Receiver<usize>,
n: usize,
}
Expand description
A barrier enables multiple tasks to synchronize the beginning of some computation.
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);
Fields§
§state: Mutex<BarrierState>
§wait: Receiver<usize>
§n: usize
Implementations§
source§impl 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 tasks.
A barrier will block n
-1 tasks which call Barrier::wait
and then wake up all
tasks at once when the n
th task 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 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.
async fn wait_internal(&self) -> BarrierWaitResult
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Barrier
impl RefUnwindSafe for Barrier
impl Send for Barrier
impl Sync for Barrier
impl Unpin for Barrier
impl UnwindSafe for Barrier
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more