Blocking queue will be very important if are processing a job/command from a queue asynchronously.
Recently I had written a thread pool where I had to use a blocking que.Motivated from C# BlockingCollection and Java’s different different blocking collection(LinkedBlockingQueue, ArrayBlockingQueue, PriorityBlockingQueue, SynchronousQueue)
I have written a blocking queue.Here I am sharing it, you can extend it based on your need.
I have used c++ 11 threading mechanism to implement it.
#pragma once #include <iostream> #include<queue> #include <mutex> template <class T> class BlockingQueue { public: BlockingQueue() { ; } void push(const T & data) { std::unique_lock<std::mutex> lock(m_mtxData); m_Data.push(data); m_Cv.notify_one(); } void pop() { std::unique_lock<std::mutex> lock(m_mtxData); if(!m_Data.empty()) m_Data.pop(); } T& front() { std::unique_lock<std::mutex> lock(m_mtxData); m_Cv.wait(lock, [&] { return !m_Data.empty(); }); T& data = m_Data.front(); return data; } T& back() { std::unique_lock<std::mutex> lock(m_mtxData); m_Cv.wait(lock, [&] { return !m_Data.empty(); }); T& data = m_Data.back(); return data; } bool empty() { return m_Data.empty(); } size_t size() { return m_Data.size(); } private: std::queue <T> m_Data; std::condition_variable m_Cv; std::mutex m_mtxData; };