《Linux多线程服务端编程:使用muduo C++网络库》笔记(2)

Linux 多线程服务器端编程:使用 muduo C++ 网络库 目录 一、线程同步精要 互斥器 mutex 条件变量 封装 MutexLock、MutexLockGuard 和 Condition 线程安全的 Singleton 实现 mutex 与 shared_ptr 的应用实例 一、线程同步精要 并发编程的两种基本模型:message passing 和 shared memory。 线程同步的四项原则: 尽量最低限度的共享对象... 阅读详情
 

C++编译链接模型

  • C++为了完全兼容C,包括C的编译/内存模型等,继续使用单遍编译,要求前向声明,要使用include等,导致编译缓慢,且在重载、虚函数等方面实现复杂
  • include将引用文件替换至当前位置,会导致代码量增多,同时include的顺序可能导致实际结果不一样
  • 前向声明可能导致函数位置互换后结果不一样
  • 头文件使用规则:
  1. 文件之间依赖尽量最小、定义式之间依赖尽量最小,避免循环依赖
  2. 让class的名称、头文件、源文件名具有相关性
  3. 令头文件自给自足
  4. 头文件内写宏,防止重复编译。#ifndef #define? #endif
  5. 如果编写程序库,公开的文件应表达模块的接口
  • 动态库的更新会影响调用者程序,会改变其他软件的功能。需要让多个大版本的动态库能够共存以保证所有调用者的独立性
  • 静态库的编译会在软件编译前,两者编译时的依赖库版本可能不同,会导致编译错误、不可预期的运行时错误。需要保证静态库与程序编译时的环境一致。
  • 静态库演化需要在底层库新增变体后,所有依赖它的高层库/程序都为之编译一个版本,多种组合方式会导致版本爆炸式增长:cab1.0_net1.2_boost1.40_gcc44_……
  • 静态/动态库都可能因为C++头文件与源文件分离的特性出现发布的库文件与头文件不一致的情况
  • 尽量用源码编译,虽然比调用库编译时间长,让build工具能够自动check out库的源码。如gyp、typhoon-blade、CMake、SCons等工具

C++面向对象与虚函数

  • 多组合少继承,不符合A is B就不继承。代码应以实用、朴实、好用、易懂为目标编写,而不是为了实用C++各种编程范式和特性而写
  • 软件开发的首要技术使命是控制复杂度,不要因为某种技术流行就直接使用,除非能降低复杂度
  • 设计模式是常用问题的解决方案,也是绕过C++语言限制的技巧
  • C/C++二进制兼容性,涉及到库的更新需要考虑。library的ABI,主要包括:
  1. 函数参数传递方式
  2. 虚函数的调用方式
  3. struct/class的内存布局,偏移量访问数据成员
  4. name mangling(重载的重命名算法)
  5. RTTI(运行时类型信息识别,多态用)和异常处理实现
  • 源码兼容,二进制不兼容的例子:
  1. 给函数增加默认参数
  2. 增加虚函数,会导致vtbl排列变化
  3. 增加默认模板类型参数会改变name mangling
  4. 改变enum值,增加class数据成员也会导致sizeof(class)变大
  • 解决方案:采用静态连接(不是静态库,是从源码编译)、为动态库增加版本管理、pimpl(头文件只暴露非虚接口并且class大小固定这样可以随意更新库文件,但会多一层间接性)
  • 基于闭包的编程:继承和多态可用std::function,std::bind来实现(闭包closure,可以将一个function对象绑定到任意对象的函数/函数上),包括设计模式中的接口,取代虚函数
  • 如果使用stdio,int64_t在32 64平台不是相同类型,需要包含inttypes.h并使用PRId64宏,如果使用iostream不需要考虑,但虚继承等效率低下。
  • iostream不是线程安全的,多个<< <<不保证原子性。不建议使用iostream,可以用stdio或者自己写针对性的操作函数

C++经验谈

  • 用异或交换变量是错误的,效率并没有增高,甚至低效,也降低了易读性
  • 不要重载全局::operator new(),去性能优化、检测内存错误、统计内存使用情况,这样第三方库无法保证同样的分配器。应替换malloc(),free()的实现
  • 除法取整有两种模式,向0取整,向负无穷取整,C++11/Java为向0,解释型语言部分是向负无穷
  • 单元测试mock可以使用设计时增加接口以多态实现(增加了虚影响效率)、编译期或链接期迟邦定-链接期垫片(通过namespace封装一套接口,利用namespace不封闭特性,可在不改变源文件情况下改动namespace的内容)
  • 慎用匿名namespace:匿名空间中的函数也是匿名的,需要引用的时候比较麻烦(调试时候,两个文件的匿名namespace中有相同名字的函数,无法区分是哪个);某些g++同一个文件的编译后二进制文件不同,可能是build tool失灵
  • 采用有利于版本管理的代码格式:合理使用换行符、多行注释用//(diff中可清晰看到大段注释的变化)、一行代码只定义一个变量、如果参数大于3个每个逗号后换行、class初始化列表也一行一个、namespace不缩进、避免使用版本控制软件的keyword substitution功能
  • 用对grep友好的代码风格(linux正则搜索命令):操作符不重载+-符号、用C++风格的cast进行类型转换

Techie亮博客,转载请注明:Coologic » 《Linux多线程服务端编程:使用muduo C++网络库》笔记(2)

Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装 Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码... 阅读详情

相关推荐

新书预告:《Linux 多线程服务端编程:使用 muduo C++ 网络库》

看完了 W. Richard Stevens 的传世经典《UNIX 网络编程》, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下手? 书中示例代码把业务逻辑和 Sockets 调用混在一起,似乎不利于将来扩展?网络编程中的遇到一些具体问题该怎么办?例如程序在本机测试正常,放到网络运行上就经常出现数据收不全的情况?TCP 协议真的有所谓的“

陈硕的Blog 4万+

《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

《Linux 多线程服务端编程:使用 muduo C++ 网络库》 电子版已在京东和亚马逊上市销售。 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kindle版:http://www.amazon.cn/dp/B00FF1XYJI 京东阅读效果: PC iPad 目前京东的阅读器没有切白边功能,值得改进。...

weixin_33919950的博客 327

Linux多线程服务端编程学习(二)如何使用muduo网络库 Centos7

安装、编译muduo,使用muduo 下载、安装编译muduo的过程 点击 https://mp.youkuaiyun.com/mdeditor/90021742# 本文以 陈硕 老师git 网站上 muduo-tutorial-master 程序为例来解释如何运用muduo库,以及其中可能会遇到的问题与解决办法。 1、下载示例程序包 下载地址 https://github.com/chenshuo/mu...

YoungSusie的博客 1618

【亲测免费】 Linux多线程服务端编程资源下载

Linux多线程服务端编程资源下载 去发现同类优质开源项目:https://gitcode.com/ 资源介绍 本仓库提供了一个资源文件的下载,该资源文件为《Linux多线程服务端编程:使用muduo C++网络库》,作者为陈硕,文件格式为PDF。 资源内容 《Linux多线程服务端编程:使用muduo C++网络库》是一本专注于Linux环境下多线程服务端编程的书籍,详细介绍了如何使用muduo...

gitblog_09732的博客 543

muduo库介绍

muduo库是一个多线程服务器开发库 muduo 作者陈硕,现在在美国加州硅谷某互联网大公司工作,从事大规模分布式的可靠系统工程。这个库是作者多年工作的总结,可以说大家学通了这个库,找一份Linux服务器开发的工作是没问题的,因为这个库是教大家Linux环境下多线程服务器开发的正规做法,这个库是用的现在C++技术,大量使用了智能指针,bind、function这些技术。 作者还出了一本书《Linux多线程服务端编程:使用muduo C++网络库》,但是这本书不适合初学者,适合具有一定网络编程经验的开发者

侯彩桦 1万+

Linux多线程服务端编程与muduo网络库实践

在多线程服务端编程中,线程是程序执行流的最小单元,允许并发执行。相比之下,进程则是资源分配的最小单位,拥有独立的地址空间。在多核处理器环境下,多线程能有效利用CPU资源,提高程序的并发处理能力。在Linux系统中,I/O模型主要分为以下几种类型:阻塞I/O(Blocking I/O)非阻塞I/O(Non-blocking I/O)I/O复用(I/O Multiplexing)信号驱动式I/O(Signal-driven I/O)

weixin_29301059的博客 684

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的

陈硕的Blog 6万+

Linux多线程服务端编程-使用muduo C++网络库

作者: 陈硕 《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。书中以muduo网络库为例,讲解这种编程模型的使用方法及注意事项。 《Linux多线程服务端编程:使用muduo C++网络库》的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。

C++(2)之Linux多线程服务端编程总结

Author: Once Day Date: 2023年1月31日/2024年8月23日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…

梅花香自苦寒来,宝剑锋从磨砺出。 2527

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]

Linux多线程服务端编程:使用muduo+C网络库

Linux多线程服务端编程:使用muduo+C网络库.pdf Linux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdfLinux多线程服务端编程:使用muduo+C网络库.pdf

《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

摘要: 《Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。 以下谈一谈这本书的写作背景与内容取舍的原因。

陈硕的Blog 3万+

Linux多线程服务端编程:使用muduo C 网络库

( Linux多线程服务端编程:使用muduo C 网络库》样章.7z )还不错,可以看看

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第六章 muduo网络库简介

2010年3月作者写了一篇《学之者生,用之者死——ACE历史与简评》(http://blog.youkuaiyun.com/Solstice/archive/2010/03/10/5364096.aspx,ACE是(Adaptive Communication Environment)是一个C++编写的开源框架,用于开发高性能、可伸缩、分布式系统的网络应用),其中提到了作者心目中理想的网络库的样子: 1.线程安全,原生支持多核多线程。 2.不考虑可移植性,不跨平台,只支持Linux,不支持Windows。 3.主要支持

tus00000的博客 1134

linux多线程服务端编程使用muduoc网络库(epub格式,体积更小,阅读体验更好)

《Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。 作者说:以下谈一谈这本书的写作背景与内容取舍的原因。 参加工作以来,我编写并维护了若干C++/Java多线程网络服务程序,这本书总结了我在开发维护这类服务程序方面的经验。工作中,我没有写过单线程的网络服务程序,没有写过C语言的网络服务程序,也没有写过运行在Windows下的网络服务程序,因此本书不涉及这些内容。

Linux多线程服务端编程:使用muduo C++网络库

Linux多线程服务端编程:使用muduo C++网络库 Linux多线程服务端编程:使用muduo C++网络库 Linux多线程服务端编程:使用muduo C++网络库

上一篇: 《Linux多线程服务端编程:使用muduo C++网络库》笔记(1)
下一篇: 百度后端C++电话一面
coologic
博客等级 码龄7年 35粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值