#include "fifo.h"
+typedef std::function<void()> job_t;
+
class ThrPool {
public:
- struct job_t {
- void (*f)(void *); //function point
- void *a; //function arguments
- };
-
- ThrPool(int sz, bool blocking=true);
+ ThrPool(size_t sz, bool blocking=true);
~ThrPool();
- template<class C, class A> bool addObjJob(C *o, void (C::*m)(A), A a);
- void waitDone();
- bool takeJob(job_t *j);
+ bool addJob(const job_t &j);
private:
- int nthreads_;
+ size_t nthreads_;
bool blockadd_;
-
fifo<job_t> jobq_;
std::vector<std::thread> th_;
- bool addJob(void (*f)(void *), void *a);
+ void do_worker();
};
-template <class C, class A> bool
-ThrPool::addObjJob(C *o, void (C::*m)(A), A a)
-{
-
- class objfunc_wrapper {
- public:
- C *o;
- void (C::*m)(A a);
- A a;
- static void func(void *vvv) {
- objfunc_wrapper *x = (objfunc_wrapper*)vvv;
- C *o = x->o;
- void (C::*m)(A ) = x->m;
- A a = x->a;
- (o->*m)(a);
- delete x;
- }
- };
-
- objfunc_wrapper *x = new objfunc_wrapper;
- x->o = o;
- x->m = m;
- x->a = a;
- return addJob(&objfunc_wrapper::func, (void *)x);
-}
-
-
#endif
-