从零开始自制实现WebServer(三)---- 华山论剑剑指线程池 大刀阔斧终开始阅读源码

博主逐步剖析C++高性能Web服务器的实现,从muduo库的simple_echo服务器开始,深入理解I/O模型和线程池。通过阅读源码,理清多线程程序运行流程,分享学习心得与代码分析过程,旨在为初学者提供一条清晰的学习路径。
摘要由CSDN通过智能技术生成


全流程实现博客链接


从零开始自制实现C++ High-Performance WebServer 全流程记录(基于muduo网络库)


前引


发愁啊 苦闷啊 好像又回到了刚开始的时候 其实我打算写这个系列博客的主要原因呢 就是像我刚开始写第一篇博客的时候 面对从零开始的时候 我连入手的地方都没有 不知道应该从哪里入手 也就像现在我写下这段话一样…

但是呢 不管怎么说我相信这个系列的最后 我是能够完成一个类似muduo的网络库的 毕竟已经开始写这个系列博客了 就是想写一下 一个不知道从哪里入手的初学者而言 是怎么一步一步逐渐有收获的

刚刚放下了 那本封面是一个小黑人在击剑的书 我觉得也差不多与他要告别了 尽管之后对于一些底层api介绍 想不起来或者想看看相关函数的时候 随时还把他拿起来翻翻找找 但是感觉还想继续往上走的话 只能与他告别了

现在想想 还好自己买了一本这个书 不然估计现在四处碰壁 哪怕碰的人都晕掉了 估计都不知道怎么入手 刚刚把陈硕大佬的《linux多线程服务器编程》有勇气的再次拿了起来 直接回到之前我看的第八章 我想着 今天的我 已经不再是两天前的我了 结果呢 发现该看不懂的还是看不懂… 估计是函数包装的太好了 每个类都太高层了 不去看看底层代码 我真不知道这些类在干什么…


好吧 是我没认真静下心来看 做完前面的铺垫 来读第八章应该还是能够看懂绝大部分 还有刚刚在看书的时候 也想起来 这几天在调整自己写代码的代码风格 之前有点按照第一本书的那种代码行风写的 一直强迫自己 刚刚又仔细看了看陈硕大佬的风格 以后还是模仿陈硕大佬写c++的代码行风来写吧

之后的时光 估计是长长与 muduo网络库为伴了 现在我已经开始进入探索muduo网络库的时间了 已经找到了切入点 而且可能很大一个原因是 就是因为前面两篇博客 自己所做的工作为这里 自己理解很多东西有了铺垫 所以才得以找到切入点入足


看了半天 第二天继续来看 发现自己还是挺没有头绪的 还是不知道从哪里入手 感觉一下子如果直接钻入细节地方 很有可能自己就会陷入进去 我刚刚忽然觉得 如果想搞懂一个东西 是不是首先得会使用呢 如果不会使用 又何从入手呢

我刚刚忽然灵机一动 不如先编译muduo网络库 然后我们从最简单的example开始 然后自己编译一下echo服务器 然后就此展开 去看一下echo服务器使用到了哪些类 然后从顶至下的去把那些接触到的类挨个挨个看了 先对全局有个感性的认识 再钻入细节探索 这才是对的

从这里开始 就开始真的进入muduo网络库的深入了


(三)华山论剑剑指线程池 大刀阔斧终开始阅读源码


1、深入探究muduo库中simple_echo服务器


本着从顶至下的原则来学习 因为刚刚我仔细思考了一下 必须要从一个运行实例开始 我们才能够一步步摸索着前行 不然的话 就像给出一个stl 只告诉你使用方法 而不给示例 那就是如同盲人摸象一般的学习


今天下午人有点疲乏 回寝室睡了一下觉 起来后4点多了 直到刚刚我才基本上把 echo_server的源码给理了清楚 并把其I/O模型也给判断了一下 发现是单线程 Reactor 其实有点让人小失误 但是好在也算是开始入了门

花了几个小时阅读源码 说实话 可能是自己对层次结构目前理的不是很清楚 也或者是确实自己阅读源码还差了一些火候 刚开始读的时候 脑子里面属实是一片乱麻

自己打开相关的头文件也好 附属的工程代码也好 前前后后打开了十余个 自己刚开始没有用笔记下来的时候 自己就在不停的在脑海中不停的在这些文件中跳转 后面越跳转越昏 越跳转越昏 后面实在受不了了 就忽然想起来 自己刚开始学数据结构的时候 手撕很多对于刚开始的我很难的那些数据结构自己也是用笔记录下来 进行辅助记忆比划 所以后面自己就开始用笔写

幸亏自己用笔记录下来了 不然真理不清楚 现在10:31了也才算是刚刚理清楚完 单线程Reactor的echo server是怎么运行的了 当然也只是主干道 还有一些自己不熟悉的 比如function bind shared_from_this等等等等 自己也都自己去用一些小例子敲了下来 剩下的部分明天来写了 今天晚上回寝室去买个本子 好久没写字了


刷完了三道日常面试题 然后又来写这篇博客了 下面贴了两张图 也就是我当时在理 simple_echo 服务器运行的分析 文件的话 是处在muduo/examples/simple中的echo服务器 整理下来 第一感觉是 陈硕大佬能够把每个类 有非常非常强的清晰规划 每个类的作用都是特别明显的 而且每个类中的耦合性非常低 如果换做其他的server 只要把回调函数设置好 然后主函数加个loop 把address绑定一下 一下子就可以用了

第二感觉是 我分析代码都花了这么久 也是感觉到自身水平的平乏和不足. 但想了想 所有的敲代码顶尖水平的人物 也都是从什么都不懂的地方学起来的 只不过比一般人多的是一颗保持学习的心 和 对技术专研的心 想了想也是

前三天 在正式打算开始忙后端项目的时候 拿着代码手足无措 不知道从哪里下手 到现在都把最简单的echo_server流程分析清楚了 何尝不是一种进步呢 哈哈 说笑了


基本流程如下 昨晚写的时候 发现自己已经快老半年没写过字了 而且昨晚翻自己的书包 想找两张空的纸张 也没有找到… 就找到了两张核酸检查表 就将就把后面空的部分写上去了 大概理清了 我打算待会再去看看有线程池的one_loop_per_thread 是怎么回事

在这里插入图片描述

在这里插入图片描述


2、深入探究netty_echo_server 再次理清多线程程序运行流程


netty_echo_server 刚刚初浅的把代码看了一下 就发现之前没有办法设置numthread 也就是线程数 现在可以设置了就是在运行的时候 后面多加一个运行参数 也就是线程数了 这次理清之后 就差不多开始 就要搭建起一个最基本的雏形模块了 我是这样打算的 就按照muduo库的构建思路来构建 因为每一个类的定义太清晰了 而且确实就是设置最基本的回调函数 如果要使用多线程 那么就设置一个numthread即可 太方便了

所以昨晚为了今天的准备 特意买了一个草稿本 就打算在草稿本上记录
花了几个小时 把代码总结了一遍 写了四页 大概把多线程的部分给搞懂了 重点在于设置了一个wakeup_fd 利用向里面写数据 并且写入前向任务队列推入了要处理的函数
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


结束语


终于花了好久的时间 把多线程的路径给看懂了 后面打算开始 自己一步步模仿着这个模式 开始写代码了 刚开始先把雏形写好 可以没有层次性 后面再组装在一起吧 这一章里面没有代码 但是是我开始阅读源码的开始 也是收获了相当相当多的 先一篇见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值