线程池实现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();
}
};