#pragma once #include #include #include template class LockingQueue { public: void push(T const &_data) { { std::lock_guard lock(guard); queue.push(_data); } signal.notify_one(); } bool empty() const { std::lock_guard lock(guard); return queue.empty(); } bool tryPop(T &_value) { std::lock_guard lock(guard); if (queue.empty()) { return false; } _value = queue.front(); queue.pop(); return true; } void waitAndPop(T &_value) { std::unique_lock lock(guard); while (queue.empty()) { signal.wait(lock); } _value = queue.front(); queue.pop(); } bool tryWaitAndPop(T &_value, int _milli) { std::unique_lock lock(guard); while (queue.empty()) { signal.wait_for(lock, std::chrono::milliseconds(_milli)); return false; } _value = queue.front(); queue.pop(); return true; } private: std::queue queue; mutable std::mutex guard; std::condition_variable signal; };