#ifndef semaphore_h #define semaphore_h #include #include #include #include #include #include using namespace std::chrono_literals; class semaphore { public: void lock() { auto backoff = 1us; while (!sem.try_acquire()) std::this_thread::sleep_for(backoff *= 2); } void unlock() { sem.release(); } private: std::binary_semaphore sem{1}; }; template class stack { public: void push(T t) { std::lock_guard l(s); container.push(t); } std::optional pop() { std::lock_guard l(s); if (!container.empty()) { T data = container.top(); container.pop(); return std::optional(data); } else { return std::nullopt; } } private: semaphore s; std::stack container; }; #endif // semaphore_h