内容简介 · · · · · ·
本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。
本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务统。
作者简介 · · · · · ·
陈硕,北京师范大学硕士,擅长C++ 多线程网络编程和实时分布式系统架构。曾在摩根士丹利IT 部门工作5 年,从事实时外汇交易系统开发。现在在美国加州硅谷某互联网大公司工作,从事大规模分布式系统的可靠性工程。编写了开源C++ 网络库muduo,参与翻译了《代码大全( 第2 版)》和《C++ 编程规范(繁体版)》,整理了《C++ Primer (第4 版)(评注版)》,并曾多次在各地技术大会演讲。
目录 · · · · · ·
前言
第1部分 C++多线程系统编程
第1章 线程安全的对象生命期管理
1.1 当析构函数遇到多线程
1.2 对象的创建很简单
1.3 销毁太难
1.4 线程安全的Obschmerver有多难
1.5 原始指针有何不妥
1.6 神器shared_ptr/weak_ptr
1.7 插曲:系统地避免各种指针错误
1.8 应用到Obschmerver上
1.9 再论shared_ptr的线程安全
1.10 shared_ptr技术与陷阱
1.11 对象池
1.12 替代方案
1.13 心得与小结
1.14 Obschmerver之谬
第2章 线程同步精要
2.1 互斥器(mutex)
2.2 条件变量(condition variable)
2.3 不要用读写锁和信号量
2.4 封装MutexLock、MutexLockGuard、Condition
2.5 线程安全的Singleton实现
2.6 sleep(3)不是同步原语
2.7 归纳与总结
2.8 借shared_ptr实现copy-on-write
第3章 多线程服务器的适用场合与常用编程模型
3.1 进程与线程
3.2 单线程服务器的常用编程模型
3.3 多线程服务器的常用编程模型
3.4 进程间通信只用TCP
3.5 多线程服务器的适用场合
3.6 “多线程服务器的适用场合”例释与答疑
第4章 C++多线程系统编程精要
4.1 基本线程原语的选用
4.2 C/C++系统库的线程安全性
4.3 Linux上的线程标识
4.4 线程的创建与销毁的守则
4.5 善用__thread关键字
4.6 多线程与IO
4.7 用RAII包装文件描述符
4.8 RAII与fork()
4.9 多线程与 fork()
4.10 多线程与signal
4.11 Linux新增系统调用的启示
小结
第5章 高效的多线程日志
5.1 功能需求
5.2 性能需求
5.3 多线程异步日志
5.4 其他方案
第2部分 muduo网络库
第6章 muduo网络库简介
6.1 由来
6.2 安装
6.3 目录结构
6.4 使用教程
6.5 性能评测
6.6 详解muduo多线程模型
第7章 muduo编程示例
7.1 五个简单TCP示例
7.2 文件传输
7.3 Boost.Asio的聊天服务器
7.4 muduo Buffer类的设计与使用
7.5 一种自动反射消息类型的Protobuf网络传输方案
7.6 在muduo中实现Protobuf编解码器与消息分发器
7.7 限制服务器的最大并发连接数
7.8 定时器
7.9 测量两台机器的网络延迟和时间差
7.10 用timing wheel踢掉空闲连接
7.11 简单的消息广播服务
7.12 “串并转换”连接服务器及其自动化测试
7.13 socks4a代理服务器
7.14 短址服务
7.15 与其他库集成
第8章 muduo网络库设计与实现
8.0 什么都不做的EventLoop
8.1 Reactor的关键结构
8.2 TimerQueue定时器
8.3 EventLoop::runInLoop()函数
8.4 实现TCP网络库
8.5 TcpServer接受新连接
8.6 TcpConnection断开连接
8.7 Buffer读取数据
8.8 TcpConnection发送数据
8.9 完善TcpConnection
8.10 多线程TcpServer
8.11 Connector
8.12 TcpClient
8.13 epoll
8.14 测试程序一览
第3部分 工程实践经验谈
第9章 分布式系统工程实践
9.1 我们在技术浪潮中的位置
9.2 分布式系统的可靠性浅说
9.3 分布式系统中心跳协议的设计
9.4 分布式系统中的进程标识
9.5 构建易于维护的分布式程序
9.6 为系统演化做准备
9.7 分布式程序的自动化回归测试
9.8 分布式系统部署、监控与进程管理的几重境界
第10章 C++编译链接模型精要
10.1 C语言的编译模型及其成因
10.2 C++的编译模型
10.3 C++链接(linking)
10.4 工程项目中头文件的使用规则
10.5 工程项目中库文件的组织原则
第11章 反思C++面向对象与虚函数
11.1 朴实的C++设计
11.2 程序库的二进制兼容性
11.3 避免使用虚函数作为库的接口
11.4 动态库接口的推荐做法
11.5 以boost::function和boost::bind取代虚函数
11.6 iostream的用途与局限
11.7 值语义与数据抽象
第12章 C++经验谈
12.1 用异或来交换变量是错误的
12.2 不要重载全局::operator new()
12.3 带符号整数的除法与余数
12.4 在单元测试中mock系统调用
12.5 慎用匿名namespace
12.6 采用有利于版本管理的代码格式
12.7 再探 std::string
12.8 用STL algorithm轻松解决几道算法面试题
第4部分 附录
附录A 谈一谈网络编程学习经验
A.1 网络编程的一些“胡思乱想”
A.2 三本必看的书
附录B 从《C++Primer (第4版)》入手学习C++
B.1 为什么要学习C++
B.2 学习C++只需要读一本大部头
B.3 继续前进
B.4 评注版使用说明
附录C 关于Boost的看法
附录D 关于TCP并发连接的几个思考题与试验
参考文献
· · · · · · (收起)
第1部分 C++多线程系统编程
第1章 线程安全的对象生命期管理
1.1 当析构函数遇到多线程
1.2 对象的创建很简单
1.3 销毁太难
1.4 线程安全的Obschmerver有多难
1.5 原始指针有何不妥
1.6 神器shared_ptr/weak_ptr
1.7 插曲:系统地避免各种指针错误
1.8 应用到Obschmerver上
1.9 再论shared_ptr的线程安全
1.10 shared_ptr技术与陷阱
1.11 对象池
1.12 替代方案
1.13 心得与小结
1.14 Obschmerver之谬
第2章 线程同步精要
2.1 互斥器(mutex)
2.2 条件变量(condition variable)
2.3 不要用读写锁和信号量
2.4 封装MutexLock、MutexLockGuard、Condition
2.5 线程安全的Singleton实现
2.6 sleep(3)不是同步原语
2.7 归纳与总结
2.8 借shared_ptr实现copy-on-write
第3章 多线程服务器的适用场合与常用编程模型
3.1 进程与线程
3.2 单线程服务器的常用编程模型
3.3 多线程服务器的常用编程模型
3.4 进程间通信只用TCP
3.5 多线程服务器的适用场合
3.6 “多线程服务器的适用场合”例释与答疑
第4章 C++多线程系统编程精要
4.1 基本线程原语的选用
4.2 C/C++系统库的线程安全性
4.3 Linux上的线程标识
4.4 线程的创建与销毁的守则
4.5 善用__thread关键字
4.6 多线程与IO
4.7 用RAII包装文件描述符
4.8 RAII与fork()
4.9 多线程与 fork()
4.10 多线程与signal
4.11 Linux新增系统调用的启示
小结
第5章 高效的多线程日志
5.1 功能需求
5.2 性能需求
5.3 多线程异步日志
5.4 其他方案
第2部分 muduo网络库
第6章 muduo网络库简介
6.1 由来
6.2 安装
6.3 目录结构
6.4 使用教程
6.5 性能评测
6.6 详解muduo多线程模型
第7章 muduo编程示例
7.1 五个简单TCP示例
7.2 文件传输
7.3 Boost.Asio的聊天服务器
7.4 muduo Buffer类的设计与使用
7.5 一种自动反射消息类型的Protobuf网络传输方案
7.6 在muduo中实现Protobuf编解码器与消息分发器
7.7 限制服务器的最大并发连接数
7.8 定时器
7.9 测量两台机器的网络延迟和时间差
7.10 用timing wheel踢掉空闲连接
7.11 简单的消息广播服务
7.12 “串并转换”连接服务器及其自动化测试
7.13 socks4a代理服务器
7.14 短址服务
7.15 与其他库集成
第8章 muduo网络库设计与实现
8.0 什么都不做的EventLoop
8.1 Reactor的关键结构
8.2 TimerQueue定时器
8.3 EventLoop::runInLoop()函数
8.4 实现TCP网络库
8.5 TcpServer接受新连接
8.6 TcpConnection断开连接
8.7 Buffer读取数据
8.8 TcpConnection发送数据
8.9 完善TcpConnection
8.10 多线程TcpServer
8.11 Connector
8.12 TcpClient
8.13 epoll
8.14 测试程序一览
第3部分 工程实践经验谈
第9章 分布式系统工程实践
9.1 我们在技术浪潮中的位置
9.2 分布式系统的可靠性浅说
9.3 分布式系统中心跳协议的设计
9.4 分布式系统中的进程标识
9.5 构建易于维护的分布式程序
9.6 为系统演化做准备
9.7 分布式程序的自动化回归测试
9.8 分布式系统部署、监控与进程管理的几重境界
第10章 C++编译链接模型精要
10.1 C语言的编译模型及其成因
10.2 C++的编译模型
10.3 C++链接(linking)
10.4 工程项目中头文件的使用规则
10.5 工程项目中库文件的组织原则
第11章 反思C++面向对象与虚函数
11.1 朴实的C++设计
11.2 程序库的二进制兼容性
11.3 避免使用虚函数作为库的接口
11.4 动态库接口的推荐做法
11.5 以boost::function和boost::bind取代虚函数
11.6 iostream的用途与局限
11.7 值语义与数据抽象
第12章 C++经验谈
12.1 用异或来交换变量是错误的
12.2 不要重载全局::operator new()
12.3 带符号整数的除法与余数
12.4 在单元测试中mock系统调用
12.5 慎用匿名namespace
12.6 采用有利于版本管理的代码格式
12.7 再探 std::string
12.8 用STL algorithm轻松解决几道算法面试题
第4部分 附录
附录A 谈一谈网络编程学习经验
A.1 网络编程的一些“胡思乱想”
A.2 三本必看的书
附录B 从《C++Primer (第4版)》入手学习C++
B.1 为什么要学习C++
B.2 学习C++只需要读一本大部头
B.3 继续前进
B.4 评注版使用说明
附录C 关于Boost的看法
附录D 关于TCP并发连接的几个思考题与试验
参考文献
· · · · · · (收起)
"Linux多线程服务端编程"试读 · · · · · ·
原文摘录 · · · · · ·
-
析构动作在创建时被捕获 这是一个非常有用的特性,这意味着: 虚析构不再是必需的 shared_ptr<void>可以持有任何对象,而且能够安全地释放。 shared_ptr对象可以安全地跨越模块边界,比如从dll里返回,而不会造成从模块A分配的内存在模块B里被释放这种错误。 二进制兼容性,即便Foo对象的大小变了,那么旧的客户代码依然可以使用新的动态库,而无需重新编译。前提是Foo的头文件中不会访问对象的成员的inline函数,并且Foo对象的由动态库中的Factory构造,返回其shared_ptr。 析构函数可以定制 (查看原文) —— 引自第20页 -
析构所在的线程 对象的析构是同步的,当最后一个指向x的shared_ptr离开其作用域的时候,x会同时在同一个线程析构。这个线程不一定是对象诞生的线程。 (查看原文) —— 引自第20页
喜欢读"Linux多线程服务端编程"的人也喜欢的电子书 · · · · · ·
支持 Web、iPhone、iPad、Android 阅读器
喜欢读"Linux多线程服务端编程"的人也喜欢 · · · · · ·
-
- STL源码剖析 8.7
-
- TCP/IP详解 卷1:协议 9.2
-
- Effective C++ 9.5
-
- UNIX环境高级编程 9.4
-
- 深入理解C++11 7.7
-
- 计算机系统要素 9.2
-
- 操作系统导论 9.3
-
- Tomcat架构解析 7.8
-
- Orange'S 8.7
Linux多线程服务端编程的书评 · · · · · · ( 全部 16 条 )

这本书的书名应该叫<陈硕文集>或<陈硕博客精选>
我也算是慕名而来入的这本书, 总的来说是非常失望的. 这本书的书名应该叫<陈硕文集>或<陈硕博客精选>更合适. 我是如此的失望,以至于来此专门写一篇书评来帮助后来的同学. 总结: 书的组织杂乱无章, 尽管内容并不都是"滥竽", 但是"充数"绝对是存在的, 我只是想看看"多线程"和"服...
(展开)
> 更多书评 16篇
论坛 · · · · · ·
书中的url简直就是宝库,大家一定要知道 | 来自liuh | 1 回应 | 2017-07-10 13:26:15 |
电子book在京东和亚马逊有售 | 来自陈硕 | 1 回应 | 2014-11-20 10:35:42 |
已购入,对书的一点期待 | 来自蓝血熊猫 | 3 回应 | 2013-08-28 22:35:38 |
上市半年已重印两次,总印数达到了9000册 | 来自陈硕 | 2013-07-17 14:36:40 | |
配套网页及试读样章 | 来自陈硕 | 14 回应 | 2013-03-14 16:26:09 |
> 浏览更多话题
在哪儿借这本书 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
- 多线程并发 (hoterran)
- 金融工程与量化投资 (Alan Xin)
- 肌肉男 (potter)
- 3.Linux.入门 (葡萄)
- UNIX/LINUX学习预备 (笨蛋.mk⑨)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
订阅关于Linux多线程服务端编程的评论:
feed: rss 2.0
2 有用 城北大洋桃有毛 2013-06-22 19:06:12
略口水
1 有用 左亦 2022-04-09 14:02:32
C++,多线程,网络库实践
1 有用 举个栗子 2021-12-28 23:59:31
太惭愧了,买了这本书7年多了才真正把它读完。正如作者所说,这本书适合有较好基础或者有相关工作经验的人读。其中讲到的东西确实有很多是从事相关工作时会遇到的问题,而且很多是让人头疼的问题。比如作者一直强调的基于对象而不是面向对象这一点,我是非常赞同的。 虽然副标题叫做《使用muduo C++ 网络库》,其实真正介绍这个库的内容并不是很多。作者在书中花了很多篇幅去介绍C++多线程会遇到的问题和解决方案,... 太惭愧了,买了这本书7年多了才真正把它读完。正如作者所说,这本书适合有较好基础或者有相关工作经验的人读。其中讲到的东西确实有很多是从事相关工作时会遇到的问题,而且很多是让人头疼的问题。比如作者一直强调的基于对象而不是面向对象这一点,我是非常赞同的。 虽然副标题叫做《使用muduo C++ 网络库》,其实真正介绍这个库的内容并不是很多。作者在书中花了很多篇幅去介绍C++多线程会遇到的问题和解决方案,并且对于各种方案的优劣都做了自己的对比,这些心得和经验很少能在一般的书籍中获得。 即使这本书有很多内容是从作者的博客录入的,但里面对于各种引用的来源都附上了地址或者书名,这一点可以说是非常难能可贵。如果能认认真真再把相关的引用看完,那读这本书的收获就真的非常大了。 (展开)
1 有用 虎弟想当幸运儿 2022-07-01 23:46:56
纵观整个学科都是当仁不让的顶级教程,c++并发编程一本通,c++11设计思想一本通,媲美effictive系列,并且东西都不算过时。有了module和concepts需要补充一些内容,但不麻烦。
2 有用 。 2021-06-14 21:17:21
关注编程语言的实现,难免被时代整体的技术进步所冲刷,失去本有的价值