Crate pool_barrier [−] [src]
A barrier for blocking a main thread until the completion of work which has been offloaded to worker threads,
without blocking the worker threads.
This barrier allows blocking on wait()
until n
Checkpoints
have been cleared using check_in()
or drop()
.
Threads which call check_in() do not block, in contrast to std::sync::Barrier
which blocks all threads and potentially deadlocks when used with an over-utilised threadpool.
To use and reuse the Barrier
an ActiveBarrier
must be generated using activate()
, which can then be used to generate checkpoints using 'checkpoint()'.
An ActiveBarrier cannot be dropped without blocking until all checkpoints are cleared.
Generating more than n
Checkpoints
results in a panic. Generating less than n
Checkpoints
will result in an error being returned from wait()
.
If a Checkpoint is passed by a panicking thread, wait()
will return an error.
Example
use pool_barrier::{Barrier, ActiveBarrier}; const THREADS: usize = 5; let mut barrier = Barrier::new(THREADS); run(barrier.activate()); run(barrier.activate()); // a barrier can be reused once checkpoints are cleared fn run(mut barrier: ActiveBarrier){ for i in 0..THREADS{ let mut checkpoint = barrier.checkpoint(); std::thread::spawn(move||{ println!("thread_id: {}", i); // all of these occur in arbitrary order checkpoint.check_in(); // this does not block the spawned thread }); } barrier.wait().unwrap(); // main thread blocks here until all checkpoints are cleared println!("main thread"); // this occurs last }
Structs
ActiveBarrier |
An ActiveBarrier can be used to generate checkpoints which must be cleared (usually by worker threads) before |
Barrier |
A stack allocated synchronisation barrier. See crate doc for use. |
Checkpoint |
A checkpoint which must be cleared, by calling |
Enums
WaitError |
Type Definitions
WaitResult |