[#absl-BlockingCounter]
= xref:absl.adoc[absl]::BlockingCounter
:relfileprefix: ../
:mrdocs:

A counter that lets a thread block until a number of actions complete&period;

== Synopsis

Declared in `&lt;absl&sol;synchronization&sol;blocking&lowbar;counter&period;h&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
class BlockingCounter;
----

== Description

This class allows a thread to block for a pre&hyphen;specified number of actions&period; `BlockingCounter` maintains a single non&hyphen;negative abstract integer &quot;count&quot; with an initial value `initial&lowbar;count`&period; A thread can then call `Wait()` on this blocking counter to block until the specified number of events occur&semi; worker threads then call `DecrementCount()` on the counter upon completion of their work&period; Once the counter&apos;s internal &quot;count&quot; reaches zero, the blocked thread unblocks&period;

A `BlockingCounter` requires the following&colon;

* its `initial&lowbar;count` is non&hyphen;negative&period;
* the number of calls to `DecrementCount()` on it is at most `initial&lowbar;count`&period;
* `Wait()` is called at most once on it&period;

Given the above requirements, a `BlockingCounter` provides the following guarantees&colon;

* Once its internal &quot;count&quot; reaches zero, no legal action on the object can further change the value of &quot;count&quot;&period;
* When `Wait()` returns, it is legal to destroy the `BlockingCounter`&period;
* When `Wait()` returns, the number of calls to `DecrementCount()` on this blocking counter exactly equals `initial&lowbar;count`&period;

Example&colon;

[,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&equals;`]  [.small]#[deleted]#
| Deleted copy assignment&semi; `BlockingCounter` is not copyable&period;
| xref:absl/BlockingCounter/DecrementCount.adoc[`DecrementCount`] 
| Decrements the counter by one&period;
| xref:absl/BlockingCounter/Wait.adoc[`Wait`] 
| Blocks until the counter reaches zero&period;
|===



[.small]#Created with https://www.mrdocs.com[MrDocs]#
