class ThreadPool {
private:
- queue<T *> q;
+ queue<T> q;
Mutex q_lock;
Semaphore q_sem;
int num_threads;
vector<pthread_t> thread;
- U *u;
- void (*func)(U*,T*);
- void (*prefunc)(U*,T*);
+ U u;
+ void (*func)(U,T);
+ void (*prefunc)(U,T);
string myname;
static void *foo(void *arg)
q_sem.Get();
if (q.empty()) break;
- T *op = get_op();
+ T op = get_op();
tpdout(DBLVL) << ".func thread "<< pthread_self() << " on " << op << endl;
func(u, op);
}
}
- T* get_op()
+ T get_op()
{
- T* op;
+ T op;
q_lock.Lock();
{
op = q.front();
public:
- ThreadPool(char *myname, int howmany, void (*f)(U*,T*), U *obj, void (*pf)(U*,T*) = 0) :
+ ThreadPool(char *myname, int howmany, void (*f)(U,T), U obj, void (*pf)(U,T) = 0) :
num_ops(0), num_threads(howmany),
thread(num_threads),
u(obj),
}
}
- void put_op(T* op) {
+ void put_op(T op) {
tpdout(DBLVL) << ".put_op " << op << endl;
q_lock.Lock();
q.push(op);