C++11 新接口 實現線程池類

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();
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章