1.EventThread

(1)任何一个线程,只要创建并运行了EventLoop,都称之为IO线程
(2)IO线程不一定是主线程
(3)muduo并发模型one loop per thread + threadpool
(4)为了方便今后使用,定义了EventLoopThread类,该类封装了IO线程
(5)EventLoopThread创建了一个线程
(6)在线程函数中创建了一个EvenLoop对象并调用EventLoop::loop

2.代码

1.EventLoopThread.h

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is a public header file, it must only include public header files.#ifndef MUDUO_NET_EVENTLOOPTHREAD_H
#define MUDUO_NET_EVENTLOOPTHREAD_H#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>
#include <muduo/base/Thread.h>#include <boost/noncopyable.hpp>namespace muduo
{
namespace net
{class EventLoop;class EventLoopThread : boost::noncopyable
{public:typedef boost::function<void(EventLoop*)> ThreadInitCallback;EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback());~EventLoopThread();EventLoop* startLoop(); // 启动线程,该线程就成为了IO线程private:void threadFunc();        // 线程函数EventLoop* loop_;            // loop_指针指向一个EventLoop对象bool exiting_;Thread thread_;MutexLock mutex_;Condition cond_;ThreadInitCallback callback_;        // 回调函数在EventLoop::loop事件循环之前被调用
};}
}#endif  // MUDUO_NET_EVENTLOOPTHREAD_H

2.EventLoopthread.cc

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)#include <muduo/net/EventLoopThread.h>#include <muduo/net/EventLoop.h>#include <boost/bind.hpp>using namespace muduo;
using namespace muduo::net;EventLoopThread::EventLoopThread(const ThreadInitCallback& cb): loop_(NULL),exiting_(false),thread_(boost::bind(&EventLoopThread::threadFunc, this)),mutex_(),cond_(mutex_),callback_(cb)
{
}EventLoopThread::~EventLoopThread()
{exiting_ = true;loop_->quit();     // 退出IO线程,让IO线程的loop循环退出,从而退出了IO线程thread_.join();
}EventLoop* EventLoopThread::startLoop()
{assert(!thread_.started());thread_.start();{MutexLockGuard lock(mutex_);while (loop_ == NULL){cond_.wait();}}return loop_;
}void EventLoopThread::threadFunc()
{EventLoop loop;if (callback_){callback_(&loop);}{MutexLockGuard lock(mutex_);// loop_指针指向了一个栈上的对象,threadFunc函数退出之后,这个指针就失效了// threadFunc函数退出,就意味着线程退出了,EventLoopThread对象也就没有存在的价值了。// 因而不会有什么大的问题loop_ = &loop;cond_.notify();}loop.loop();//assert(exiting_);
}

3.Reactor_test06.cc

#include <muduo/net/EventLoop.h>
#include <muduo/net/EventLoopThread.h>#include <stdio.h>using namespace muduo;
using namespace muduo::net;void runInThread()
{printf("runInThread(): pid = %d, tid = %d\n",getpid(), CurrentThread::tid());
}int main()
{printf("main(): pid = %d, tid = %d\n",getpid(), CurrentThread::tid());EventLoopThread loopThread;EventLoop* loop = loopThread.startLoop();// 异步调用runInThread,即将runInThread添加到loop对象所在IO线程,让该IO线程执行loop->runInLoop(runInThread);sleep(1);// runAfter内部也调用了runInLoop,所以这里也是异步调用loop->runAfter(2, runInThread);sleep(3);loop->quit();printf("exit main().\n");
}

30muduo_net库源码分析(六)相关推荐

  1. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  2. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  3. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

  4. surprise库源码分析

    最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...

  5. Python Requests库源码分析

    1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...

  6. 【转】ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  7. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  8. cJSON库源码分析

    cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的Json格式解析库. 那什么是Json格式?这里照搬度娘百科的说法: Json(JavaScript Object Notat ...

  9. python库源码分析_python第三方库Faker源码解读

    源码背景 Faker是一个Python第三方库,GITHUB开源项目,主要用于创建伪数据创建的数据包含地理信息类.基础信息类.个人账户信息类.网络基础信息类.浏览器信息类.文件信息类.数字类 文本加密 ...

最新文章

  1. 2021-2027年中国一氧化氮行业市场研究及前瞻分析报告
  2. oracle exists 变量,Num58 Oracle总结
  3. 全部都是div,换点新花样。【HTML5的标签】
  4. 数据结构和算法练习网站_视频和练习介绍了10种常见数据结构
  5. 中班机器人上课视频_家委会:出班费买智能扫地机器人,不用家长搞卫生了,莫名其妙...
  6. python怎么封装供java调用_python调用第三方java包实例
  7. Box2D v2.0.1 用户手册
  8. Intel 64/x86_64/x86/IA-32处理器串行化指令(2) - 参考
  9. DataNode的流式接口
  10. torch使用cudnn7
  11. Vue2.x全家桶WebApp
  12. Java常用软件安装包分享
  13. 微软Exchange Server 0Day漏洞,尽快修复
  14. Error: Device or resource busy
  15. excel提取身份证出生日期_Excel如何从身份证号码中提取年龄
  16. 如何导出一篇英文文献的全部参考文献
  17. ubuntu下载todesk安装包
  18. 自制J-LINK遇到的问题
  19. 重装mysql_重装MySQL步骤详解
  20. 12天背诵楞严咒的技巧_如何背诵楞严咒?背诵楞严咒的诀窍

热门文章

  1. 获得N^2个往返接力数字表格的算法
  2. 同城o2o商城系统开发和运营四大要素
  3. 写了个简单的pdo的封装类
  4. Scala基础 - 函数和方法的区别
  5. Office 365 Sway-移动设备推送利器
  6. 循环中的continue功能
  7. 一名靠谱的JavaScript程序员应备的素质
  8. 解析Excel2007之关键点_Sheet.xml(一)
  9. Linux 命令(115)—— rev 命令
  10. vector向量容器元素排序与查找