muduo网络库net篇三:I/O线程

本文详细介绍了EventLoopThread及EventLoopThreadPool的工作原理。解释了如何通过主线程创建线程池并分配任务,以及线程间的通信机制。

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)。即使你们当中有人太闲了,项目结束前不能把你们辞退,当然他可以销毁这个组重新建组。你也没有主动提出离职的权利。
你们的主管实际上仅仅分配任务,不做其他事情(挺现实的…)。除非他人品太差,手下没有人了——即只能建一个空的组(线程池)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值