EventLoopThread类
EventLoopThread顾名思义,事件循环线程。
当创建此类线程,并执行:
EventLoop* startLoop(); //启动线程 执行loop() 并返回线程loop_
线程就会一直事件循环,直到对象析构或通过返回的loop_终止。
事件由主线程设置,且设置事件只能通过startLoop()返回的loop_,所以此函数会阻塞,直到线程给loop_赋值。
EventLoopThreadPool类
EventLoopThreadPool类成员数据:
EventLoop* baseLoop_; //主线程loop
string name_;
bool started_;
int numThreads_; //线程数
int next_; //供getNextLoop()使用
boost::ptr_vector<EventLoopThread> threads_; //线程
std::vector<EventLoop*> loops_; //各线程的loop
主线程创建EventLoopThreadPool对象,设置线程数并start启动线程池。通过getNextLoop()获得EventLoopThread的loop_,分配任务。
线程池为空时,退化为baseLoop_的调度。实际使用中应该设置定时器,让主线程的loop可退出。当然实际也不应该创建空的线程池。
小结
这部分比较简单,内容也不多。为了好理解,举一个例子吧:
你的主管(主线程)手下有不少干将(EventLoopThread),他创建了微信组(EventLoopThreadPool),把自己作为组长(baseLoop_),并把手下人拉入组,启动(start)项目。
他能够获得了你们的微信号(loop_),通过微信给你们分配任务,聊天记录可以知道你们手头上还有什么(loop_.queueSize、loop_.hasChannel)。即使你们当中有人太闲了,项目结束前不能把你们辞退,当然他可以销毁这个组重新建组。你也没有主动提出离职的权利。
你们的主管实际上仅仅分配任务,不做其他事情(挺现实的…)。除非他人品太差,手下没有人了——即只能建一个空的组(线程池)。
本文详细介绍了EventLoopThread及EventLoopThreadPool的工作原理。解释了如何通过主线程创建线程池并分配任务,以及线程间的通信机制。

1504

被折叠的 条评论
为什么被折叠?



