温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
Linux多线程服务端编程_使用muduo
C+网络库
Linux
多线程
服务端
编程
使用
muduo
C+
网络
Linux 多线程服务端编程:使用 muduo C+网络库陈硕著 Publishing House of Electronics Industry 北京BEIJING 内 容 简 介 本书主要讲述采用现代C+在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以muduo网络库为例,讲解这种编程模型的使用方法及注意事项。本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(ClP)数据 Linux 多线程服务端编程:使用 muduo C+网络库/陈硕著 北京:电子工业出版社,20131 ISBN 978-7-121-19282-1 L 陈 Linux 操作系统-程序设计 TP31689 中国版本图书馆 CIP 数据核字(2012)第 304000 号 策划编辑:张春雨 责任编辑:李云静 印 刷:北京丰源印刷厂 装 订:三河市鹏成印业有限公司 出版发行:电子工业出版社 北京市海淀区万寿路 173 信箱 邮编 100036 开 本:787980 1/16 印张:385 字数:801 千字 印 次:2013 年 1 月第 1 次印刷 印 数:3000 册 定价:8900 元 凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888。质量投诉请发邮件至 zltspheicomcn,盗版侵权举报请发邮件至 dbqqpheicomcn。服务热线:(010)88258888。前言本书主要讲述采用现代 C+在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,这也是我对过去 5 年编写生产环境下的多线程服务端程序的经验总结。本书重点讲解多线程网络服务器的一种 IO 模型,即 one loop per thread。这是一种适应性较强的模型,也是 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以 muduo网络库为例,讲解这种编程模型的使用方法及注意事项。muduo 是一个基于非阻塞 IO 和事件驱动的现代 C+网络库,原生支持 oneloop per thread 这种 IO 模型。muduo 适合开发 Linux 下的面向业务的多线程服务端网络应用程序,其中“面向业务的网络编程”的定义见附录 A。“现代 C+”指的不是 C+11 新标准,而是 2005 年 TR1 发布之后的 C+语言和库。与传统 C+相比,现代 C+的变化主要有两方面:资源管理(见第 1 章)与事件回调(见第 449 页)。本书不是多线程编程教程,也不是网络编程教程,更不是 C+教程。读者应该已经大致读过UNIX 环境高级编程、UNIX 网络编程、C+Primer或与之内容相近的书籍。本书不谈 C+11,因为目前(2012 年)主流的 Linux 服务端发行版的 g+版本都还停留在 4.4,C+11 进入实用尚需一段时日。本书适用的硬件环境是主流 x86-64 服务器,多路多核 CPU、几十 GB 内存、千兆以太网互联。除了第 5 章讲诊断日志之外,本书不涉及文件 IO。本书分为四大部分,第 1 部分“C+多线程系统编程”考察多线程下的对象生命期管理、线程同步方法、多线程与 C+的结合、高效的多线程日志等。第 2 部分“muduo 网络库”介绍使用现成的非阻塞网络库编写网络应用程序的方法,以及muduo 的设计与实现。第 3 部分“工程实践经验谈”介绍分布式系统的工程化开发方法和 C+在工程实践中的功能特性取舍。第 4 部分“附录”分享网络编程和 C+语言的学习经验。本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。(本书不涉及分布式存储系统,也不涉及 UDP。)iiiiv前言术语与排版范例本书大量使用英文术语,甚至有少量英文引文。设计模式的名字一律用英文,例如 Observer、Reactor、Singleton。在中文术语不够突出时,也会使用英文,例如 class、heap、event loop、STL algorithm 等。注意几个中文 C+术语:对象实体(instance)、函数重载决议(resolution)、模板具现化(instantiation)、覆写(override)虚函数、提领(dereference)指针。本书中的英语可数名词一般不用复数形式,例如两个 class,6 个 syscall;但有时会用(s)强调中文名词是复数。fd 是文件描述符(file descriptor)的缩写。“CPU 数目”一般指的是核(core)的数目。容量单位 kB、MB、GB 表示的字节数分别为 103、106、109,在特别强调准确数值时,会分别用 KiB、MiB、GiB 表示 210、220、230字节。用诸如 11.5 表示本书第 11.5 节,L42表示上下文中出现的第 42 行代码。JCP、CC2e 等是参考文献,见书末清单。一般术语用普通罗马字体,如 mutex、socket;C+关键字用无衬线字体,如class、this、mutable;函数名和 class 名用等宽字体,如 fork(2)、muduo:EventLoop,其中fork(2)表示系统函数fork()的文档位于manpage第2节,可以通过man 2 fork命令查看。如果函数名或类名过长,可能会折行,行末有连字号“-”,如 EventLoop-ThreadPool。文件路径和 URL 采用窄字体,例如 muduo/base/Date.h、http:/。用中文楷体表示引述别人的话。代码本书的示例代码以开源项目的形式发布在 GitHub 上,地址是 http:/ http:/ recipes/thread 的路径是压缩包内的相对路径,读者不难找到其对应的 GitHub URL。本书引用代码的形式如下,左侧数字是文件的行号,右侧的“muduo/base/Types.h”是文件路径1。例如下面这几行代码是 muduo:string 的 typedef。muduo/base/Types.h15namespace muduo161718#ifdef MUDUO_STD_STRING19using std:string;20#else/!MUDUO_STD_STRING21typedef _gnu_cxx:_sso_string string;22#endifmuduo/base/Types.h1在第 6、7 两章的 muduo 示例代码中,路径 muduo/examples/XXX 会简写为 examples/XXX。此外,第 8 章会把 recipes/reactor/XXX 简写为 reactor/XXX。Linux 多线程服务端编程:使用 muduo C+网络库前言v本书假定读者熟悉 diff-u 命令的输出格式,用于表示代码的改动。本书正文中出现的代码有时为了照顾排版而略有改写,例如改变缩进规则,去掉单行条件语句前后的花括号等。就编程风格而论,应以电子版代码为准。联系方式邮箱:主页:http:/ URL 可从这里找到。)微博:http:/ 多线程服务端编程:使用 muduo C+网络库内容一览第 1 部分C+多线程系统编程1第 1 章线程安全的对象生命期管理.3第 2 章线程同步精要.31第 3 章多线程服务器的适用场合与常用编程模型.59第 4 章C+多线程系统编程精要.83第 5 章高效的多线程日志.107第 2 部分muduo 网络库123第 6 章muduo 网络库简介.125第 7 章muduo 编程示例.177第 8 章muduo 网络库设计与实现.277第 3 部分工程实践经验谈337第 9 章分布式系统工程实践.339第 10 章C+编译链接模型精要.391第 11 章反思 C+面向对象与虚函数.429第 12 章C+经验谈.501第 4 部分附录559附录 A谈一谈网络编程学习经验.561附录 B从C+Primer(第 4 版)入手学习 C+.579附录 C关于 Boost 的看法.591附录 D关于 TCP 并发连接的几个思考题与试验.593参考文献.599vi目录第 1 部分C+多线程系统编程1第 1 章 线程安全的对象生命期管理31.1当析构函数遇到多线程.31.1.1线程安全的定义.41.1.2MutexLock 与 MutexLockGuard.41.1.3一个线程安全的 Counter 示例.41.2对象的创建很简单.51.3销毁太难.71.3.1mutex 不是办法.71.3.2作为数据成员的 mutex 不能保护析构.81.4线程安全的 Observer 有多难.81.5原始指针有何不妥.111.6神器 shared_ptr/weak_ptr.131.7插曲:系统地避免各种指针错误.141.8应用到 Observer 上.161.9再论 shared_ptr 的线程安全.171.10 shared_ptr 技术与陷阱.191.11 对象池.211.11.1enable_shared_from_this.231.11.2弱回调.241.12 替代方案.261.13 心得与小结.261.14 Observer 之谬.28第 2 章 线程同步精要312.1互斥器(mutex).32viiviii目录2.1.1只使用非递归的 mutex.332.1.2死锁.352.2条件变量(condition variable).402.3不要用读写锁和信号量.432.4封装 MutexLock、MutexLockGuard、Condition.442.5线程安全的 Singleton 实现.482.6sleep(3)不是同步原语.502.7归纳与总结.512.8借 shared_ptr 实现 copy-on-write.52第 3 章 多线程服务器的适用场合与常用编程模型593.1进程与线程.593.2单线程服务器的常用编程模型.613.3多线程服务器的常用编程模型.623.3.1one loop per thread.623.3.2线程池.633.3.3推荐模式.643.4进程间通信只用 TCP.653.5多线程服务器的适用场合.673.5.1必须用单线程的场合.693.5.2单线程程序的优缺点.703.5.3适用多线程程序的场景.713.6“多线程服务器的适用场合”例释与答疑.74第 4 章C+多线程系统编程精要834.1基本线程原语的选用.844.2C/C+系统库的线程安全性.854.3Linux 上的线程标识.894.4线程的创建与销毁的守则.914.4.1pthread_cancel 与 C+.944.4.2exit(3)在 C+中不是线程安全的.944.5善用 _thread 关键字.964.6多线程与 IO.98Linux 多线程服务端编程:使用 muduo C+网络库目录ix4.7用 RAII 包装文件描述符.994.8RAII 与 fork().1014.9多线程与 fork().1024.10 多线程与 signal.1034.11 Linux 新增系统调用的启示.105第 5 章 高效的多线程日志1075.1功