C++11 线程安全的队列模板
C++11 标准库版本
主要参考C++11 并发编程第二版
#include <queue> #include <mutex> #include <memory> #include <condition_variable> template<typename T> class SafeQueue { public: SafeQueue() {} ~SafeQueue() {} void push(T new_data) { std::lock_guard<std::m_mutex> lk(m_mut); // 1.全局加锁 m_dataQueue.push(std::move(new_data)); // 2.push时独占锁 m_cond.notify_one(); } void wait_and_pop(T& val) { std::unique_lock<std::m_mutex> ulk(m_mut); // 3.全局加锁 m_cond.wait(ulk,[this]() { return !m_dataQueue.empty(); }); // 4.front 和 pop_front时独占锁 val=std::move(m_dataQueue.front()); m_dataQueue.pop(); } std::shared_ptr<T> wait_and_pop() { std::unique_lock<std::m_mutex> ulk(m_mut); m_cond.wait(ulk,[this]() { return !m_dataQueue.empty(); }); std::shared_ptr<T> val(std::make_shared<T>(std::move(m_dataQueue.front()))); m_dataQueue.pop(); return val; } bool try_pop(T& val) { std::lock_guard<std::m_mutex> lk(m_mut); if(m_dataQueue.empty()) return false; val=std::move(m_dataQueue.front()); m_dataQueue.pop(); return true; } std::shared_ptr<T> try_pop() { std::shared_ptr<T> val; std::lock_guard<std::m_mutex> lk(m_mut); if(m_dataQueue.empty()) return val; val=std::make_shared<T>(std::move(m_dataQueue.front())); m_dataQueue.pop(); return val; } bool empty() { std::lock_guard<std::m_mutex> lk(m_mut); return m_dataQueue.empty(); } int count() { std::lock_guard<std::m_mutex> lk(m_mut); return m_dataQueue.size(); } private: std::queue<T> m_dataQueue; std::mutex m_mut; std::condition_variable m_cond; }