#include #include #include template class ThreadsafeQueue { std::queue queue_; mutable std::mutex mutex_; // Moved out of public interface to prevent races between this // and pop(). bool empty() const { return queue_.empty(); } public: ThreadsafeQueue() = default; ThreadsafeQueue(const ThreadsafeQueue &) = delete ; ThreadsafeQueue& operator=(const ThreadsafeQueue &) = delete ; ThreadsafeQueue(ThreadsafeQueue&& other) { std::lock_guard lock(mutex_); queue_ = std::move(other.queue_); } virtual ~ThreadsafeQueue() { } unsigned long size() const { std::lock_guard lock(mutex_); return queue_.size(); } std::optional pop() { std::lock_guard lock(mutex_); if (queue_.empty()) { return {}; } T tmp = queue_.front(); queue_.pop(); return tmp; } void push(const T &item) { std::lock_guard lock(mutex_); queue_.push(item); } };