52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#ifndef __COUNTDOWNLATCH_NIPUN__
|
|
#define __COUNTDOWNLATCH_NIPUN__
|
|
|
|
#include <cinttypes>
|
|
#include <cstdint>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
|
|
namespace clatch
|
|
{
|
|
class countdownlatch {
|
|
public:
|
|
/*! Constructor
|
|
\param count, the value the countdownlatch object should be initialized with
|
|
*/
|
|
explicit countdownlatch(uint32_t count);
|
|
|
|
|
|
/*!
|
|
await causes the caller to wait until the latch is counted down to zero,
|
|
if wait time nanosecs is not zero, then maximum wait is for nanosec nanoseconds
|
|
\param nanosecs is waittime in nanoseconds, by default it is zero which specifies
|
|
indefinite wait
|
|
*/
|
|
void await(uint64_t nanosecs=0);
|
|
|
|
/*!
|
|
Countdown decrements the count of the latch, signalling all waiting thread if the
|
|
count reaches zero.
|
|
*/
|
|
void count_down();
|
|
|
|
/*!
|
|
get_count returns the current count
|
|
*/
|
|
uint32_t get_count();
|
|
|
|
private:
|
|
std::condition_variable cv;
|
|
std::mutex lock;
|
|
uint32_t count;
|
|
|
|
// deleted constructors/assignmenet operators
|
|
countdownlatch() = delete;
|
|
countdownlatch(const countdownlatch& other) = delete;
|
|
countdownlatch& operator=(const countdownlatch& opther) = delete;
|
|
};
|
|
}
|
|
|
|
#endif
|