#pragma once #include #include #include template class SafeQueue { public: SafeQueue() = default; void push(const T& v) { { std::unique_lock lk(m); q.push(v); } cv.notify_one(); } T pop() { std::unique_lock lk(m); cv.wait(lk, [this] { return !q.empty(); }); T v = q.front(); q.pop(); return v; } bool try_pop(T& v, int timeout_ms = 0) { std::unique_lock lk(m); if (!cv.wait_for(lk, std::chrono::milliseconds(timeout_ms), [this] { return !q.empty(); })) { return false; } v = q.front(); q.pop(); return true; } bool empty() const { std::scoped_lock lk(m); return q.empty(); } size_t size() const { std::scoped_lock lk(m); return q.size(); } private: mutable std::mutex m; std::condition_variable cv; std::queue q; };