A counter that lets a thread block until a number of actions complete.
Declared in <absl/synchronization/blocking_counter.h>
class BlockingCounter;
This class allows a thread to block for a pre-specified number of actions. BlockingCounter maintains a single non-negative abstract integer "count" with an initial value initial_count. A thread can then call Wait() on this blocking counter to block until the specified number of events occur; worker threads then call DecrementCount() on the counter upon completion of their work. Once the counter's internal "count" reaches zero, the blocked thread unblocks.
A BlockingCounter requires the following:
its initial_count is non-negative.
the number of calls to DecrementCount() on it is at most initial_count.
Wait() is called at most once on it.
Given the above requirements, a BlockingCounter provides the following guarantees:
Once its internal "count" reaches zero, no legal action on the object can further change the value of "count".
When Wait() returns, it is legal to destroy the BlockingCounter.
When Wait() returns, the number of calls to DecrementCount() on this blocking counter exactly equals initial_count.
Example:
BlockingCounter bcount(N); // there are N items of work
... Allow worker threads to start.
... On completing each work item, workers do:
... bcount.DecrementCount(); // an item of work has been completed
bcount.Wait(); // wait for all work to be complete
| Name | Description |
|---|---|
BlockingCounter [constructor] | Constructors |
operator= [deleted] | Deleted copy assignment; BlockingCounter is not copyable. |
DecrementCount | Decrements the counter by one. |
Wait | Blocks until the counter reaches zero. |