7 #ifndef BOTAN_THREAD_POOL_H_
8 #define BOTAN_THREAD_POOL_H_
10 #include <botan/types.h>
16 #include <type_traits>
20 #include <condition_variable>
54 void queue_thunk(std::function<
void ()>);
56 template<
class F,
class... Args>
57 auto run(
F&& f, Args&&... args) -> std::future<
typename std::result_of<
F(Args...)>
::type>
59 typedef typename std::result_of<
F(Args...)>
::type return_type;
61 auto future_work = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
62 auto task = std::make_shared<std::packaged_task<return_type ()>>(future_work);
63 auto future_result = task->get_future();
64 queue_thunk([task]() { (*task)(); });
72 std::vector<std::thread> m_workers;
75 std::condition_variable m_more_tasks;
76 std::deque<std::function<void ()>> m_tasks;
size_t worker_count() const
auto run(F &&f, Args &&...args) -> std::future< typename std::result_of< F(Args...)>::type >