#ifndef COUNTDOWNLATCH_H #define COUNTDOWNLATCH_H #include #include class DoricCountDownLatch { Q_DISABLE_COPY(DoricCountDownLatch) QSemaphore m_sem{INT_MAX}; public: DoricCountDownLatch() {} ~DoricCountDownLatch() { m_sem.acquire(INT_MAX); m_sem.release(INT_MAX); } class Locker { DoricCountDownLatch *sem; public: Locker(const Locker &other) : sem{other.sem} { sem->m_sem.acquire(); } Locker(Locker &&other) : sem{other.sem} { other.sem = nullptr; } Locker(DoricCountDownLatch *sem) : sem{sem} { sem->m_sem.acquire(); } ~Locker() { if (sem) sem->m_sem.release(); } }; Locker lock() { return Locker{this}; } }; #endif // COUNTDOWNLATCH_H