#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() {} void push(T new_value) { std::lock_guard lk(mut); data_queue.push(std::move(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=std::move(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(std::move(data_queue.front()))); data_queue.pop(); return res; } bool try_pop(T& value) { std::lock_guard lk(mut); if(data_queue.empty()) return false; value=std::move(data_queue.front()); data_queue.pop(); } 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(std::move(data_queue.front()))); data_queue.pop(); return res; } bool empty() const { std::lock_guard lk(mut); return data_queue.empty(); } }; int main() { threadsafe_queue rq; }