Struct Barrier
pub struct Barrier { /* private fields */ }
Expand description
A barrier enables multiple tasks to synchronise the beginning of some computation.
let mut handles = Vec::with_capacity(10);
let barrier = Rc::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::task::spawn_local(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
impl Barrier
pub 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
.
pub 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
.
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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoPropValue<Option<T>> for T
impl<T> IntoPropValue<Option<T>> for T
source§fn into_prop_value(self) -> Option<T>
fn into_prop_value(self) -> Option<T>
Convert
self
to a value of a Properties
struct.source§impl<T> IntoPropValue<T> for T
impl<T> IntoPropValue<T> for T
source§fn into_prop_value(self) -> T
fn into_prop_value(self) -> T
Convert
self
to a value of a Properties
struct.