博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(P35)muduo_base库源码分析:muduo库如何支持多线程,multiple reactors
阅读量:4298 次
发布时间:2019-05-27

本文共 1750 字,大约阅读时间需要 5 分钟。

文章目录

1.muduo库如何支持多线程

  • muduo支持多线程的方式:一个程序有多个EventLoop,一个EventLoop属于一个线程,也就是所谓的one Loop per thread
  • EventLoopThread(IO线程类)
  • EventLoopThreadPool(IO线程池类)
    IO线程池的功能是开启若干个IO线程,并让这些IO线程处于事件循环的状态

2.multiple reactors

  • 每个Reactor都属于一个线程;

  • mainReactor关注的是acceptor,也就是监听socket所关注的事件;

  • subReactor关注的是已连接socket所关注的事件,每次新到一个连接,就选择一个subReactor来处理该连接(也就选择了该Reactor所对应的线程来处理连接);

  • 若没有一个subReactor,那么mainReactor既要处理监听socket和已连接socket的事件;

    在这里插入图片描述

  • eg:35\jmuduo\muduo\net\EventLoopThreadPool.h

    35\jmuduo\muduo\net\EventLoopThreadPool.cc
    35\jmuduo\muduo\net\CMakeLists.txt
    35\jmuduo\muduo\net\TcpServer.cc

  • eg测试:35\jmuduo\tests\Reactor_test09.cc

    35\jmuduo\tests\CMakeLists.txt

  • 测试:

    (1)EventLoop loop;中包含一个boost::scoped_ptr poller_;里面会创建一个epoll_creat(),也就是说3号fd被poll fd所占用,称之为pollfd;第3个fd没有关注其某些事件,就不会调用updateChannel,所以也没有打印出来;
    (2)boost::scoped_ptr timerQueue_;是4号fd,会关注timerQueue_的可读事件,从而调用了updateChannel(),从而调用了epoll的updateChannel();
    (3)int wakeupFd_; wakeupFd_应该等于5;
    (4)接下来是 TcpServer server_;它包含了一个Acceptor,boost::scoped_ptr acceptor_; (5)acceptor_又包含了一个监听socket(Socket acceptSocket_;),是6号fd;
    (6)第七个fd是int idleFd_;第7个fd没有关注其某些事件,就不会调用updateChannel,所以也没有打印出来;
    客户端telnet连接2个过来,服务端的日志如下:
    在这里插入图片描述
    只是运行服务端
    在这里插入图片描述
    当一个telnet连接过来,监听socket产生了可读事件,6这个socket产生了可读事件,打印printActiveChannels,且创建了一个新的socket,fd号=8,需要关注其可读事件
    在这里插入图片描述
    telnet客户端发送数据,此时是socket=8产生了可读事件
    在这里插入图片描述
    在这里插入图片描述

  • eg测试:35\jmuduo\tests\Reactor_test10.cc

    35\jmuduo\tests\CMakeLists.txt

  • 测试:多线程程序的fd的使用情况。telnet启动2个客户端。

    在这里插入图片描述
    在这里插入图片描述
    6号socket就是监听socket
    6号socket就是主线程的EventLoop对象的返回的活跃的Accept通道
    在这里插入图片描述
    接着创建一个新的连接出来,分配一个线程来处理。10是第一个IO线程的EventLoop对象的wakeupFd被唤醒了。
    // 由于当前线程与ioLoop所属的线程不在同一个线程,把connectEstablished加入到ioLoop线程所属的EventLoop队列中
    ioLoop->runInLoop(boost::bind(&TcpConnection::connectEstablished, conn));
    在这里插入图片描述
    在这里插入图片描述
    13号fd被唤醒,与上分析方法类似
    在这里插入图片描述
    客户端发送数据,那么可以看到对应的printActiveChannels的wakeupFd_处理可读事件。下面是2个telnet客户端,发送数据的情况
    在这里插入图片描述
    在这里插入图片描述

转载地址:http://rmiws.baihongyu.com/

你可能感兴趣的文章
Mysql到HBase的迁移
查看>>
Sqoop import进阶
查看>>
Hive语句是如何转化成MapReduce任务的
查看>>
Hive创建table报错:Permission denied: user=lenovo, access=WRITE, inode="":suh:supergroup:rwxr-xr-x
查看>>
Hive执行job时return code 2排查
查看>>
hive常用函数及数据结构介绍
查看>>
Hive面试题干货(亲自跟着做了好几遍,会了的话对面试大有好处)
查看>>
力扣题解-589. N叉树的前序遍历(递归和迭代)
查看>>
力扣题解-700. 二叉搜索树中的搜索(分治法思想,递归的方式求解)
查看>>
力扣题解-230. 二叉搜索树中第K小的元素(递归方法,中序遍历解决)
查看>>
力扣题解-746. 使用最小花费爬楼梯(动态规划)
查看>>
力扣题解-103. 二叉树的锯齿形层序遍历(广度优先搜索)
查看>>
力扣题解-387. 字符串中的第一个唯一字符
查看>>
利用selenium爬虫模拟浏览器访问CSDN博客
查看>>
力扣题解-1046. 最后一块石头的重量
查看>>
力扣题解-86. 分隔链表
查看>>
力扣题解-123. 买卖股票的最佳时机 III(动态规划)
查看>>
力扣题解-122. 买卖股票的最佳时机 II(动态规划/贪心)
查看>>
1202. 交换字符串中的元素(并查集)
查看>>
力扣题解-684. 冗余连接(并查集)
查看>>