wait_group
#include <async/wait-group.hpp>
wait_group is a synchronization primitive that waits for a counter (that can
be incremented) to reach zero. It conceptually maps to a group of related work
being done in parallel, and a few consumers waiting for that work to be done.
The amount of work is increased by calls to add() and decreased by calls to
done().
This struct also implements
BasicLockable so
that it can be used with std::unique_lock.
Prototype
struct wait_group {
void done(); // (1)
void add(int n); // (2)
sender wait(cancellation_token ct); // (3)
sender wait(); // (4)
void lock(); // (5)
void unlock(); // (6)
};
- "Finishes" a work (decrements the work count).
- "Adds" more work (increments the work count by
n). - Returns a sender for the wait operation. The operation waits for the counter to drop to zero.
- Same as (3) but it cannot be cancelled.
- Equivalent to
add(1). - Equivalent to
done().
Arguments
n- amount of work to "add" to this work groupct- the cancellation token to use to listen for cancellation.
Return values
- This method doesn't return any value.
- This method doesn't return any value.
- This method returns a sender of unspecified type. The sender completes with
either
trueto indicate success, orfalseto indicate that the wait was cancelled. - Same as (3) except the sender completes without a value.
Examples
async::wait_group wg { 3 };
([&wg] () -> async::detached {
std::cout << "before wait" << std::endl;
co_await wg.wait();
std::cout << "after wait" << std::endl;
})();
auto done = [&wg] () {
std::cout << "before done" << std::endl;
wg.done();
std::cout << "after done" << std::endl;
};
done();
done();
std::cout << "before add" << std::endl;
wg.add(2);
std::cout << "after add" << std::endl;
done();
done();
done();
Output:
before wait
before done
after done
before done
after done
before add
after add
before done
after done
before done
after done
before done
after wait
after done