1 #ifndef THREADPOOL_H_INCLUDED 2 #define THREADPOOL_H_INCLUDED 32 #include <condition_variable> 49 void add_thread(std::function<
void()> initializer);
50 template<
class F,
class... Args>
52 -> std::future<
typename std::result_of<F(Args...)>::type>;
54 std::vector<std::thread> m_threads;
55 std::queue<std::function<void()>> m_tasks;
58 std::condition_variable m_condvar;
63 m_threads.emplace_back([
this, initializer] {
66 std::function<void()> task;
68 std::unique_lock<std::mutex> lock(m_mutex);
69 m_condvar.wait(lock, [
this]{
return m_exit || !m_tasks.empty(); });
70 if (m_exit && m_tasks.empty()) {
73 task = std::move(m_tasks.front());
82 for (
size_t i = 0; i < threads; i++) {
87 template<
class F,
class... Args>
89 -> std::future<
typename std::result_of<F(Args...)>::type> {
90 using return_type =
typename std::result_of<F(Args...)>::type;
92 auto task = std::make_shared< std::packaged_task<return_type()> >(
93 std::bind(std::forward<F>(f), std::forward<Args>(args)...)
96 std::future<return_type> res = task->get_future();
98 std::unique_lock<std::mutex> lock(m_mutex);
99 m_tasks.emplace([task](){(*task)();});
101 m_condvar.notify_one();
107 std::unique_lock<std::mutex> lock(m_mutex);
110 m_condvar.notify_all();
111 for (std::thread & worker: m_threads) {
119 template<
class F,
class... Args>
121 m_taskresults.emplace_back(
122 m_pool.
add_task(std::forward<F>(f), std::forward<Args>(args)...)
126 for (
auto && result: m_taskresults) {
132 std::vector<std::future<void>> m_taskresults;
void add_thread(std::function< void()> initializer)
Definition: ThreadPool.h:62
ThreadGroup(ThreadPool &pool)
Definition: ThreadPool.h:118
Definition: ThreadPool.h:116
Definition: ThreadPool.h:39
void add_task(F &&f, Args &&... args)
Definition: ThreadPool.h:120
void wait_all()
Definition: ThreadPool.h:125
auto add_task(F &&f, Args &&... args) -> std::future< typename std::result_of< F(Args...)>::type >
Definition: ThreadPool.h:88
~ThreadPool()
Definition: ThreadPool.h:105
A set of useful method and class.
Definition: Random.cpp:27
void initialize(std::size_t)
Definition: ThreadPool.h:81