diff options
Diffstat (limited to 'latch.h')
-rw-r--r-- | latch.h | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -0,0 +1,41 @@ +#ifndef UTILS_TIMER_H +#define UTILS_TIMER_H + +#include <condition_variable> +#include <mutex> + +#include <cassert> + +/// latch +/// +/// A simple one-shot latch based on a mutex and condition variable. +/// +/// The latch is initialized with a number N of threads to wait for. Different +/// threads can call arrive_and_wait() on the latch. Those threads enter a wait +/// state until the Nth thread calls arrive_and_wait(), which then releases all +/// threads at the same time. +struct latch { + explicit latch(std::size_t cnt) : m_cnt{cnt} {} + ~latch() { + assert(m_cnt == 0); + } + + void arrive_and_wait() { + std::unique_lock<std::mutex> lk(m_mtx); + m_cnt -= 1; + + if (m_cnt != 0) { + m_cv.wait(lk, [this]() { return m_cnt == 0; }); + } else { + m_cv.notify_all(); + } + } + + private: + std::size_t m_cnt; + + std::mutex m_mtx; + std::condition_variable m_cv; +}; + +#endif |