[#absl-BlockingCounter] = xref:absl.adoc[absl]::BlockingCounter :relfileprefix: ../ :mrdocs: A counter that lets a thread block until a number of actions complete. == Synopsis Declared in `<absl/synchronization/blocking_counter.h>` [source,cpp,subs="verbatim,replacements,macros,-callouts"] ---- class BlockingCounter; ---- == Description 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: [,cpp] ---- 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 ---- == Member Functions [cols="1,4"] |=== | Name| Description | xref:absl/BlockingCounter/2constructor-02.adoc[`BlockingCounter`] [.small]#[constructor]# | Constructors | xref:absl/BlockingCounter/operator_assign.adoc[`operator=`] [.small]#[deleted]# | Deleted copy assignment; `BlockingCounter` is not copyable. | xref:absl/BlockingCounter/DecrementCount.adoc[`DecrementCount`] | Decrements the counter by one. | xref:absl/BlockingCounter/Wait.adoc[`Wait`] | Blocks until the counter reaches zero. |=== [.small]#Created with https://www.mrdocs.com[MrDocs]#