|
Boost Users : |
Subject: [Boost-users] asio::io_service as a thread-pool executor
From: aiooua (aiooua_at_[hidden])
Date: 2011-09-08 18:50:07
I'm trying to use boost::asio::io_service as a thread pool executor.
Here's my attempt:
---- using std::vector; using boost::bind; using boost::thread; using boost::shared_ptr; using boost::asio::io_service; class executor { public: executor(size_t n): service_(n), work_(service_) { for (size_t i = 0; i < n; i++) { shared_ptr<thread> worker(new thread(bind(&io_service::run, &service_))); pool_.push_back(worker); } } ~executor() { service_.stop(); for (auto i = pool_.begin(); i != pool_.end(); ++i) { (*i)->join(); } } template<typename F> void submit(F task) { service_.post(task); } private: io_service service_; io_service::work work_; vector<shared_ptr<thread> > pool_; }; void work() {} void other_work(const char *c) {} struct functor_work { void operator()() {} }; auto lambda = [] {}; int main() { executor e(4); e.submit(work); e.submit(boost::bind(other_work, "input")); e.submit(functor_work()); e.submit(lambda); } ---- Is this usage correct or am I missing anything here? The bit I'm not sure about in particular is this: Is it guaranteed that the io_service::run will wait for the completion of the posted jobs (via io_service::post) after I have called io_service::stop? In other words, do I have to explicitly ensure that my executor instance lives at least as long as the last submitted job has finished? Or can I assume that io_service::run will only return after all its posted jobs have had a chance to finish? Thanks!
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net