前面的文章中提到游戏服务器中存在很多的不同种类的线程,多个同类线程组成为线程池,不同的线程池组合在一起形成更大的线程池。
一种线程池可以抽象为以下的类结构:
class ThreadPool
{
public:
struct CallBack {
virtual void exec(Thread* t) = 0;
virtual ~CallBack(){}
};
typedef vector<Thread *> Cont;
ThreadPool();
~ThreadPool();
void add(Thread* t);
Thread* get_by_index(const Cont::size_type i);
Thread* operator[] (const Cont::size_type i);
void join_all();
void exec_all(CallBack &c) {
for (auto it = co.being(); it != co.end(); ++it) {
c.exec(*it);
}
}
const Cont::size_type size() {
return co.size();
}
private:
Cont co;
};
对于有各种不同种类的线程池"TCP服务端任务线程池"来说可以定义为如下类结构:
class TCPServerTaskPool: private Nocopy
{
public:
bool add_verify(TCPServerTask *);
void add_sync(TCPServerTask *);
void add_main(TCPServerTask *);
void add_recycle(TCPServerTask *);
...
private:
ThreadPool verify_pool;//验证线程池
SyncThread *sync_thread; //同步线程
ThreadPool main_pool;//主线程池
RecycleThread *recycle_thread; //回收线程
...
};
class SyncThread : public Thread, public TCPServerTaskQue
{
public:
...
virtual void run();
private:
TCPServerTaskPool* pool;
std::list<TCPServerTask* > tasks; //任务链表
void add_task(TCPServerTask* task);
void remove_task(TCPServerTask* task);
...
};
//和上面的SyncThread类似
class RecycleThread : public Thread, public TCPServerTaskQue
{
public:
...
virtual void run();
private:
TCPServerTaskPool* pool;
std::list<TCPServerTask* > tasks; //任务链表
void add_task(TCPServerTask* task);
void remove_task(TCPServerTask* task);
...
};
//TCP服务端任务缓冲队列,TCPServerTask*放进该缓冲队列
class TCPServerTaskQue
{
public:
void add_task(TCPServerTask* task);
...
private:
std::queue<TCPServerTask*, std::deque<TCPServerTask*> > queue;
...
};
参考资料:
使用C++11实现线程池的两种方法_Tattoo的博客-CSDN博客_c++11线程池