54 template<
typename F,
typename... Args>
auto enqueue(F&& f, Args&&... args) -> std::future<
typename std::invoke_result_t<F, Args...>>;
58 std::vector<std::thread> m_workers;
59 std::queue<std::function<void()>> m_tasks;
60 std::mutex m_queue_mutex;
61 std::condition_variable m_condition;
66 template<
typename F,
typename... Args>
auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<
typename std::invoke_result_t<F,Args...>>
68 using return_type =
typename std::invoke_result_t<F, Args...>;
69 auto task = std::make_shared< std::packaged_task<return_type()> >( f, args... );
70 std::future<return_type> res = task->get_future();
71 if(! m_enableThreadPool ) { f(args...);
return res; }
75 std::unique_lock<std::mutex> lock(m_queue_mutex);
76 if(m_stop)
throw std::runtime_error(
"enqueue on stopped ThreadPool");
77 m_tasks.emplace([task](){ (*task)(); });
79 m_condition.notify_one();