Struct async_lock::Barrier
source · pub struct Barrier { /* private fields */ }
Expand description
A counter to synchronize multiple tasks at the same time.
Implementations§
source§impl Barrier
impl Barrier
sourcepub fn wait(&self) -> BarrierWait<'_> ⓘ
pub fn wait(&self) -> BarrierWait<'_> ⓘ
Blocks the current task until all tasks reach this point.
Barriers are reusable after all tasks have synchronized, and can be used continuously.
Returns a BarrierWaitResult
indicating whether this task is the “leader”, meaning the
last task to call this method.
Examples
use async_lock::Barrier;
use futures_lite::future;
use std::sync::Arc;
use std::thread;
let barrier = Arc::new(Barrier::new(5));
for _ in 0..5 {
let b = barrier.clone();
thread::spawn(move || {
future::block_on(async {
// The same messages will be printed together.
// There will NOT be interleaving of "before" and "after".
println!("before wait");
b.wait().await;
println!("after wait");
});
});
}
sourcepub fn wait_blocking(&self) -> BarrierWaitResult
pub fn wait_blocking(&self) -> BarrierWaitResult
Blocks the current thread until all tasks reach this point.
Barriers are reusable after all tasks have synchronized, and can be used continuously.
Returns a BarrierWaitResult
indicating whether this task is the “leader”, meaning the
last task to call this method.
Blocking
Rather than using asynchronous waiting, like the wait
method,
this method will block the current thread until the wait is complete.
This method should not be used in an asynchronous context. It is intended to be used in a way that a barrier can be used in both asynchronous and synchronous contexts. Calling this method in an asynchronous context may result in a deadlock.
Examples
use async_lock::Barrier;
use futures_lite::future;
use std::sync::Arc;
use std::thread;
let barrier = Arc::new(Barrier::new(5));
for _ in 0..5 {
let b = barrier.clone();
thread::spawn(move || {
// The same messages will be printed together.
// There will NOT be interleaving of "before" and "after".
println!("before wait");
b.wait_blocking();
println!("after wait");
});
}