class Job
{
protected:
int i;
public:
Job(int c) :i(c) {}
virtual void doJob() { printf("job : %d\n", i);}
};
class ThreadPool
{
vector<thread*> pool;
public:
ThreadPool(int n):close(false), max_num(n)
{
start();
}
void start()
{
for (int i = 0; i < max_num; ++i)
pool.push_back(new thread(&ThreadPool::run, this));
}
void run()
{
while (true)
{
unique_lock<mutex> lk(m_lock);
while (que.empty() && !close)
cond.wait(lk, [this]() {return !(this->que.empty() || this->close);});
if (close)
break;
shared_ptr<Job> job = que.front();
que.pop();
lk.unlock();
job->doJob();
}
}
void addJob(shared_ptr<Job> job)
{
lock_guard<mutex> lk(m_lock);
que.push(job);
cond.notify_one();
}
void finish()
{
close = true;
cond.notify_all();
for (int i = 0; i < max_num; ++i)
{
pool[i]->join();
}
}
bool empty()
{
return que.empty();
}
~ThreadPool()
{
for (int i = 0; i < max_num; ++i)
delete pool[i];
}
queue<shared_ptr<Job>> que;
mutex m_lock;
condition_variable cond;
int max_num;
bool close;
};
需要完成什么工作,只需要在类Job 的基础上派生子类,并重写虚函数接口doJob即可。如下例子:
class AJob : public Job
{
public:
AJob(int c):Job(c){}
void doJob()
{
printf("AJob : %d\n", Job::i);
}
};
class BJob : public Job
{
public:
BJob(int c):Job(c){}
void doJob()
{
printf("BJob : %d\n", Job::i);
}
};
int main()
{
ThreadPool t(4);
for (int i = 0; i < 11; ++i)
{
if (i % 2)
{
shared_ptr<Job> job(new AJob(i));
t.addJob(job);
}
else
{
shared_ptr<Job> job(new BJob(i));
t.addJob(job);
}
}
while (!t.empty());
t.finish();
}