我正在尝试创建一个可以运行来自未知类的函数的线程池。我不希望必须创建非成员作为代理。我设法创建了一个工作池和工作线程类以及一个任务结构,所有这些都是模板。
// ThreadPool.h
/* Threadpool creates N WorkerThreads (each worker has a ptr to the creating pool),
these block until a task is ready then call ThreadPool::doTask() */
template<class T>
struct Task {
Task() : func(0), inst(0) { }
Task(boost::function<void(T*)> function, T* instance) : func(0), inst(0) {
func = function;
inst = instance;
}
void operator()() {
Task::func(inst);
}
T* inst;
boost::function<void(T*)> func;
};
template<class T>
class ThreadPool {
template<class T> friend class WorkerThread;
public:
void addTask(Task<T> task) {
... // Some stuff
}
bool doTask() {
Task<T> task;
... // Gets a task from std::queue
// Check the task actually exists!
if(task.func && task.inst) {
// Do the task
(task)();
}
}
private:
std::queue<Task<T>> mTasks;
};
照原样,如果我确定 ThreadPool 和 Task 的类,则此代码有效。但我希望能够调用未知类类型的成员。我曾考虑过一个 void ptr,但我找不到将其转换为有效实例 ptr 的方法。我也研究了 boost::mem_fun 但很难真正掌握它。
我已经简要了解了 C++0x,据我了解,它应该可以更轻松地解决我的问题,但如果可能的话,我想在那之前解决这个问题。