25 #ifndef EXE4CPP_ASIO_THREADPOOL_H 26 #define EXE4CPP_ASIO_THREADPOOL_H 43 typedef std::function<void(uint32_t)> thread_init_t;
46 const std::shared_ptr<asio::io_service>& io_service,
57 const std::shared_ptr<asio::io_service>& io_service,
59 const thread_init_t& on_thread_start,
60 const thread_init_t& on_thread_exit
61 ) : io_service{io_service},
62 on_thread_start{on_thread_start},
63 on_thread_exit{on_thread_exit},
64 infinite_timer{*io_service}
71 infinite_timer.expires_at(std::chrono::steady_clock::time_point::max());
72 infinite_timer.async_wait([](
const std::error_code&) {});
74 for (uint32_t i = 0; i < concurrency; ++i)
76 auto run = [
this, i]()
80 threads.push_back(std::make_unique<std::thread>(run));
92 if (!this->is_shutdown)
94 this->is_shutdown =
true;
95 this->infinite_timer.cancel();
96 for (
auto& thread : threads)
104 void run(uint32_t threadnum)
106 this->on_thread_start(threadnum);
108 this->io_service->run();
110 this->on_thread_exit(threadnum);
113 const std::shared_ptr<asio::io_service> io_service;
115 thread_init_t on_thread_start;
116 thread_init_t on_thread_exit;
118 bool is_shutdown =
false;
120 asio::basic_waitable_timer<std::chrono::steady_clock> infinite_timer;
121 std::vector<std::unique_ptr<std::thread>> threads;
exe4cpp header-only library namespace