#pragma once #include #include #include namespace ROSBridge { template class ThreadSafeQueue { public: ThreadSafeQueue(); ~ThreadSafeQueue(); T pop_front(); void push_back(const T& item); void push_back(T&& item); int size(); bool empty(); private: std::deque _queue; std::mutex _mutex; std::condition_variable _cond; }; template ThreadSafeQueue::ThreadSafeQueue(){} template ThreadSafeQueue::~ThreadSafeQueue(){} template T ThreadSafeQueue::pop_front() { std::unique_lock mlock(_mutex); while (_queue.empty()) { _cond.wait(mlock); } T t = std::move(_queue.front()); _queue.pop_front(); return t; } template void ThreadSafeQueue::push_back(const T& item) { std::unique_lock mlock(_mutex); _queue.push_back(item); mlock.unlock(); // unlock before notificiation to minimize mutex con _cond.notify_one(); // notify one waiting thread } template void ThreadSafeQueue::push_back(T&& item) { std::unique_lock mlock(_mutex); _queue.push_back(std::move(item)); mlock.unlock(); // unlock before notificiation to minimize mutex con _cond.notify_one(); // notify one waiting thread } template int ThreadSafeQueue::size() { std::unique_lock mlock(_mutex); int size = _queue.size(); mlock.unlock(); return size; } } // namespace