-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththr_pool.h
66 lines (49 loc) · 1.04 KB
/
thr_pool.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef __THR_POOL__
#define __THR_POOL__
#include <pthread.h>
#include <vector>
#include "fifo.h"
class ThrPool {
public:
struct job_t {
void *(*f)(void *); //function point
void *a; //function arguments
};
ThrPool(int 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);
private:
pthread_attr_t attr_;
int nthreads_;
bool blockadd_;
fifo<job_t> jobq_;
std::vector<pthread_t> th_;
bool addJob(void *(*f)(void *), void *a);
};
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;
return 0;
}
};
objfunc_wrapper *x = new objfunc_wrapper;
x->o = o;
x->m = m;
x->a = a;
return addJob(&objfunc_wrapper::func, (void *)x);
}
#endif