读muduo网络库笔记(2.8章)

该笔记出自陈硕的《Linux多线程服务端编程》,作者比较注重版权问题,写个读后笔记应该没什么问题吧,如果有,会及时删除,没有的话继续写点笔记

--------------------------------------------

该书在2.8章介绍了copy-on-write的一种做法实例,解决了前文提到的几个需要解决的问题。

第一版本的代码:

改版本代码问题在于,如果在Foo::doit中调用了post函数会造成死锁。(不过改bug容易定位)

copy-on-write版本代码:

这是正确的写法,下面分析一下作者提供的错误的写法。(自己以前的错误写法就在作者列举的例子中 -。-)

错误原因:

错误一是会导致read端在遍历的时候迭代器失效;

错误二是多个线程同时post,会出现某些线程的Foo对象添加失败,因为copy的都是老的g_foos,并且各线程之间并不同步;

错误三导致的结果跟错误二相同,只是错误的姿势不一样。

时间: 2024-10-13 22:26:01

读muduo网络库笔记(2.8章)的相关文章

Muduo网络库源码分析(一) EventLoop事件循环(Poller和Channel)

从这一篇博文起,我们开始剖析Muduo网络库的源码,主要结合<Linux多线程服务端编程>和网上的一些学习资料! (一)TCP网络编程的本质:三个半事件 1. 连接的建立,包括服务端接受(accept) 新连接和客户端成功发起(connect) 连接.TCP 连接一旦建立,客户端和服务端是平等的,可以各自收发数据. 2. 连接的断开,包括主动断开(close 或shutdown) 和被动断开(read(2) 返回0). 3. 消息到达,文件描述符可读.这是最为重要的一个事件,对它的处理方式决定

muduo网络库预备知识点

TCP网络编程的三个半事件 非阻塞网络编程中应用层要使用缓冲区 发送方应用层为什么使用缓冲区 接收方应用层方为什么使用缓冲 如何设计使用缓冲区 什么是Reactor模式 non-blocking IO IO multiplexing muduo推荐的模式 线程池大小的阻抗匹配原则 Eventloop采用level trigger的原因 前面都在分析muduo/base中的源码,这些是辅助网络库的.在分析网络库前,先总结一下相关知识点. TCP网络编程要关注哪些问题?muduo网络库总结为三个半事

muduo网络库使用心得

上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩.下了mudo使用手冊和035版的代码看了下结构,感觉是一个比較成熟并且方便使用的网络库.本人手头也有自己的网络库,尽管不敢说是一个多强大的网络库,但毕竟在外网也稳定运营了几年,多组同一时候在线也跑过30w左右,单组server也能跑上w人.做游戏server几年的经验,感觉稳定性才是网游server最核心最重要的环节,效率还在其次,这也是眼下网游server普遍採用分组架构决定的,从运营的角度来看,有时候一组serv

Muduo网络库源码分析(六)TcpConnection 的生存期管理

TcpConnection是使用shared_ptr来管理的类,因为它的生命周期模糊.TcpConnection表示已经建立或正在建立的连接,建立连接后,用户只需要在上层类如TcpServer中设置连接到来和消息到来的处理函数,继而回调TcpConnection中的 setConnectionCallback和setMessageCallback函数,实现对事件的处理.用户需要关心的事件是有限的,其他都由网络库负责. TcpConnection中封装了InputBuffer和OutputBuff

Muduo网络库实战(二):实现服务器与客户端的连接

1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: 2)并发网络服务程序设计方案 详见:<Muduo_网络库使用手册>的1.6节-<详解Muduo多线程模型> @ muduo中TcpServer模式的选择:多线程模式 模式一:单线程,accept与TcpConnection用同一个线程做IO; 模式二:多线程,accept与EventL

Muduo网络库实战(一):安装和配置

1. 参考资料 <Muduo_网络库使用手册> 2. 实战记录 1) muduo依赖项安装 centos安装cmake命令:# yum install cmake centos安装libboost库:推荐使用源码安装,因为命令安装后发现muduo编译出错: (链接:boost命令安装&&源码安装) 备注: tar.bz2 解压命令 tar -jxvf *.tar.bz2 2)muduo安装位置 cd muduo源文件夹 =>../build文件夹中

muduo网络库学习笔记(9):Reactor模式的关键结构

Reactor模式简介 Reactor的意思是"反应堆",是一种事件驱动机制.它和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为"回调函数". moduo库Reactor模式的实现 muduo中Reactor的关键结构包括:EventLoop.Poller和Chann

muduo网络库学习笔记(10):定时器的实现

传统的Reactor通过控制select和poll的等待时间来实现定时,而现在在Linux中有了timerfd,我们可以用和处理IO事件相同的方式来处理定时,代码的一致性更好. 一.为什么选择timerfd 常见的定时函数有如下几种: sleep alarm usleep nanosleep clock_nanosleep getitimer / setitimer timer_create / timer_settime / timer_gettime / timer_delete timer

Muduo网络库源码分析(五)Acceptor和TcpServer类

首先,我们先提一下对Socket的封装(不复杂,所以简单说一下). Endian.h : 封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中). SocketsOps.h/ SocketsOps.cc :封装了socket相关系统调用. Socket.h/Socket.cc(Socket类): 用RAII方法封装socket file descriptor. InetAddress.h/InetAddress.cc(InetAddress类):网际地址socka