C++11 新接口 实现线程池类

class Job
{
protected:
	int i;
public:
	Job(int c) :i(c) {}
	virtual void doJob() { printf("job : %d\n", i);}
};

class ThreadPool
{
	vector 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 lk(m_lock);
			while (que.empty() && !close)
				cond.wait(lk, [this]() {return !(this->que.empty() || this->close);});
			if (close)
				break;
			shared_ptr job = que.front();
			que.pop();
			lk.unlock();
			job->doJob();
		}
	}

	void addJob(shared_ptr job)
	{
		lock_guard 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> 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(new AJob(i));
			t.addJob(job);
		}
		else
		{
			shared_ptr job(new BJob(i));
			t.addJob(job);

		}
	}
	while (!t.empty());
	t.finish();
}



你可能感兴趣的:(C++知识点,自己开发的即时通讯软件)