// C++ Includes #include #include #include #include #include #include #include namespace utils { class ThreadPool { private: std::vector _workers; std::queue> _tasks; std::mutex _queue_mutex; std::condition_variable _cv; bool _stop{false}; public: explicit ThreadPool(std::size_t threads = std::thread::hardware_concurrency()); ~ThreadPool(); template auto enqueue(F&& f, Args&&... args) -> std::future> { using return_type = std::invoke_result_t; auto task_ptr = std::make_shared>( std::bind(std::forward(f), std::forward(args)...) ); std::future result = task_ptr->get_future(); { std::unique_lock lock(_queue_mutex); if (_stop) throw std::runtime_error("Tried to enqueue on stopped ThreadPool"); _tasks.emplace([task_ptr]() { (*task_ptr)(); }); } _cv.notify_one(); return result; } }; } // End utils namespace