Using boost::threadpool with boost::future
Thursday, December 10th, 2009Here is a small C++ function which allows you to submit async jobs into the thread pool and track their execution status using the concept of futures:
#include "boost/threadpool.hpp" #include "boost/future.hpp" #include "boost/utility/result_of.hpp" #include "boost/shared_ptr.hpp" template<typename Thp, typename Func> boost::shared_future< typename boost::result_of<Func()>::type > submit_job(Thp& thp, Func f) { typedef typename boost::result_of<Func()>::type result; typedef boost::packaged_task<result> packaged_task; typedef boost::shared_ptr<boost::packaged_task<result> > packaged_task_ptr; packaged_task_ptr task(new packaged_task(f)); boost::shared_future<result> res(task->get_future()); boost::threadpool::schedule(thp, boost::bind(&packaged_task::operator(), task)); return res; }
A typical example of its possible usage:
User lookup_user_in_database(int id) { ... } ... int main() { boost::threadpool::pool thp(3);//number of threads boost::shared_future<User> future = submit_job(boost::bind(lookup_user_in_database, 10)); while(!future.is_ready()) { //do something useful } User = future.get(); ... }
boost::futures are now finally officially shipped with boost starting with 1.41 release. boost::threadpool is not yet an official boost library, however you can find it here.
Much kudos to authors of these amazing libraries!
