#pragma once #include #include #include #include #include // TODO: cleanup includes. // A threadsafe-queue. http://stackoverflow.com/a/16075550 template class ThreadedQueue { public: // Add an element to the queue. void Enqueue(T&& t) { std::lock_guard lock(mutex_); queue_.push(std::move(t)); cv_.notify_one(); } // Return all elements in the queue. std::vector DequeueAll() { std::lock_guard lock(mutex_); std::vector result; result.reserve(queue_.size()); while (!queue_.empty()) { result.emplace_back(std::move(queue_.front())); queue_.pop(); } return result; } // Get the "front"-element. // If the queue is empty, wait untill an element is avaiable. T Dequeue() { std::unique_lock lock(mutex_); while (queue_.empty()) { // release lock as long as the wait and reaquire it afterwards. cv_.wait(lock); } auto val = std::move(queue_.front()); queue_.pop(); return val; } // Get the first element from the queue without blocking. Returns a null // value if the queue is empty. optional TryDequeue() { std::lock_guard lock(mutex_); if (queue_.empty()) return nullopt; auto val = std::move(queue_.front()); queue_.pop(); return std::move(val); } private: std::queue queue_; mutable std::mutex mutex_; std::condition_variable cv_; };