// // Created by zx on 2019/12/17. // #ifndef SRC_THREADSAFEQUEUE_H #define SRC_THREADSAFEQUEUE_H #include #include #include #include template class threadsafe_queue { private: mutable std::mutex mut; std::queue data_queue; std::condition_variable data_cond; public: threadsafe_queue() {} threadsafe_queue(threadsafe_queue const& other) { std::lock_guard lk(other.mut); data_queue = other.data_queue; } ~threadsafe_queue() { while (!empty()) { try_pop(); } } size_t size() { return data_queue.size(); } void push(T new_value)//��Ӳ��� { std::lock_guard lk(mut); data_queue.push(new_value); data_cond.notify_one(); } void wait_and_pop(T& value)//ֱ����Ԫ�ؿ���ɾ��Ϊֹ { std::unique_lock lk(mut); data_cond.wait(lk, [this] {return !data_queue.empty(); }); value = data_queue.front(); data_queue.pop(); } std::shared_ptr wait_and_pop() { std::unique_lock lk(mut); data_cond.wait(lk, [this] {return !data_queue.empty(); }); std::shared_ptr res(std::make_shared(data_queue.front())); data_queue.pop(); return res; } //ֻ���� �� pop bool front(T& value) { std::lock_guard lk(mut); if (data_queue.empty()) return false; value = data_queue.front(); return true; } bool try_pop(T& value)//������û�ж���Ԫ��ֱ�ӷ��� { std::lock_guard lk(mut); if (data_queue.empty()) return false; value = data_queue.front(); data_queue.pop(); return true; } std::shared_ptr try_pop() { std::lock_guard lk(mut); if (data_queue.empty()) return std::shared_ptr(); std::shared_ptr res(std::make_shared(data_queue.front())); data_queue.pop(); return res; } bool empty() const { std::lock_guard lk(mut); return data_queue.empty(); } void clear() { while (!empty()) { try_pop(); } } }; #endif //SRC_THREADSAFEQUEUE_H