线程池实现Future负责具体操作,threadpool负责整体管理和及接口,异步化管理。
class Future : public LuceneObject { public: virtual ~Future(); protected: boost::any value; public: void set(const boost::any& value) { SyncLock syncLock(this); this->value = value; } template <typename TYPE> TYPE get() { SyncLock syncLock(this); while (value.empty()) { wait(10); } return value.empty() ? TYPE() : boost::any_cast<TYPE>(value); } }; /// Utility class to handle a pool of threads. class ThreadPool : public LuceneObject { public: ThreadPool(); virtual ~ThreadPool(); LUCENE_CLASS(ThreadPool); protected: boost::asio::io_service io_service; workPtr work; boost::thread_group threadGroup; static const int32_t THREADPOOL_SIZE; public: /// Get singleton thread pool instance. static ThreadPoolPtr getInstance(); template <typename FUNC> FuturePtr scheduleTask(FUNC func) { FuturePtr future(newInstance<Future>()); io_service.post(boost::bind(&ThreadPool::execute<FUNC>, this, func, future)); return future; } protected: // this will be executed when one of the threads is available template <typename FUNC> void execute(FUNC func, const FuturePtr& future) { future->set(func()); future->notifyAll(); } };