图书介绍

Linux多线程服务端编程 使用muduo C++网络库PDF|Epub|txt|kindle电子书版本网盘下载

Linux多线程服务端编程 使用muduo C++网络库
  • 陈硕著 著
  • 出版社: 北京:电子工业出版社
  • ISBN:9787121192821
  • 出版时间:2013
  • 标注页数:600页
  • 文件大小:211MB
  • 文件页数:618页
  • 主题词:Linux操作系统-程序设计

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

Linux多线程服务端编程 使用muduo C++网络库PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第1部分 C++多线程系统编程1

第1章 线程安全的对象生命期管理3

1.1当析构函数遇到多线程3

1.1.1线程安全的定义4

1.1.2 MutexLock与MutexLockGuard4

1.1.3一个线程安全的Counter示例4

1.2对象的创建很简单5

1.3销毁太难7

1.3.1 mutex不是办法7

1.3.2作为数据成员的mutex不能保护析构8

1.4线程安全的Observer有多难8

1.5原始指针有何不妥11

1.6神器shared_ptr/weak_ptr13

1.7插曲:系统地避免各种指针错误14

1.8应用到Observer上16

1.9再论shared_ptr的线程安全17

1.10 shared_ptr技术与陷阱19

1.11对象池21

1.11.1 enable_shared_from_this23

1.11.2弱回调24

1.12替代方案26

1.13心得与小结26

1.14 Observer之谬28

第2章 线程同步精要31

2.1互斥器(mutex)32

2.1.1只使用非递归的mutex33

2.1.2死锁35

2.2条件变量(condition variable)40

2.3不要用读写锁和信号量43

2.4封装MutexLock、MutexLockGuard、Condition44

2.5线程安全的Singleton实现48

2.6 sleep(3)不是同步原语50

2.7归纳与总结51

2.8借shared_ptr实现copy-on-write52

第3章 多线程服务器的适用场合与常用编程模型59

3.1进程与线程59

3.2单线程服务器的常用编程模型61

3.3多线程服务器的常用编程模型62

3.3.1 one loop per thread62

3.3.2线程池63

3.3.3推荐模式64

3.4进程间通信只用TCP65

3.5多线程服务器的适用场合67

3.5.1必须用单线程的场合69

3.5.2单线程程序的优缺点70

3.5.3适用多线程程序的场景71

3.6“多线程服务器的适用场合”例释与答疑74

第4章 C++多线程系统编程精要83

4.1基本线程原语的选用84

4.2 C/C++系统库的线程安全性85

4.3 Linux上的线程标识89

4.4线程的创建与销毁的守则91

4.4.1 pthread_cancel与C++94

4.4.2 exit(3)在C++中不是线程安全的94

4.5善用__thread关键字96

4.6多线程与IO98

4.7用RAII包装文件描述符99

4.8 RAII与fork()101

4.9多线程与fork()102

4.10多线程与signal103

4.11 Linux新增系统调用的启示105

第5章 高效的多线程日志107

5.1功能需求109

5.2性能需求112

5.3多线程异步日志114

5.4其他方案120

第2部分 muduo网络库123

第6章 muduo网络库简介125

6.1由来125

6.2安装127

6.3目录结构129

6.3.1代码结构131

6.3.2例子134

6.3.3线程模型135

6.4使用教程136

6.4.1 TCP网络编程本质论136

6.4.2 echo服务的实现138

6.4.3七步实现finger服务140

6.5性能评测144

6.5.1 muduo与Boost.Asio、libevent2的吞吐量对比145

6.5.2击鼓传花:对比muduo与libevent2的事件处理效率148

6.5.3 muduo与Nginx的吞吐量对比153

6.5.4 muduo与ZeroMQ的延迟对比156

6.6详解muduo多线程模型157

6.6.1数独求解服务器157

6.6.2常见的并发网络服务程序设计方案160

第7章 muduo编程示例177

7.1五个简单TCP示例178

7.2文件传输185

7.3 Boost.Asio的聊天服务器194

7.3.1 TCP分包194

7.3.2消息格式195

7.3.3编解码器LengthHeaderCodec197

7.3.4服务端的实现198

7.3.5客户端的实现200

7.4 muduo Buffer类的设计与使用204

7.4.1 muduo的IO模型204

7.4.2为什么non-blocking网络编程中应用层buffer是必需的205

7.4.3 Buffer的功能需求207

7.4.4Buffer的数据结构209

7.4.5 Buffer的操作211

7.4.6其他设计方案217

7.4.7性能是不是问题218

7.5一种自动反射消息类型的Google Protobuf网络传输方案220

7.5.1网络编程中使用Protobuf的两个先决条件220

7.5.2根据type name反射自动创建Message对象221

7.5.3 Protobuf传输格式226

7.6在muduo中实现Protobuf编解码器与消息分发器228

7.6.1什么是编解码器(codec)229

7.6.2实现ProtobufCodec232

7.6.3消息分发器(dispatcher)有什么用232

7.6.4 ProtobufCodec与ProtobufDispatcher的综合运用233

7.6.5 ProtobufDispatcher的两种实现234

7.6.6 ProtobufCodec和ProtobufDispatcher有何意义236

7.7限制服务器的最大并发连接数237

7.7.1为什么要限制并发连接数237

7.7.2在muduo中限制并发连接数238

7.8定时器240

7.8.1程序中的时间240

7.8.2 Linux时间函数241

7.8.3 muduo的定时器接口242

7.8.4 Boost.Asio Timer示例243

7.8.5 Java Netty示例245

7.9测量两台机器的网络延迟和时间差248

7.10用timing wheel踢掉空闲连接250

7.10.1 timing wheel原理251

7.10.2代码实现与改进254

7.11简单的消息广播服务257

7.12“串并转换”连接服务器及其自动化测试260

7.13 socks4a代理服务器264

7.13.1 TCP中继器264

7.13.2 socks4a代理服务器267

7.13.3 N:1与1:N连接转发267

7.14短址服务267

7.15与其他库集成268

7.15.1 UDNS270

7.15.2 c-ares DNS272

7.15.3 curl273

7.15.4更多275

第8章 muduo网络库设计与实现277

8.0什么都不做的EventLoop277

8.1 Reactor的关键结构280

8.1.1 Channel class280

8.1.2 Pollerclass283

8.1.3 EventLoop的改动287

8.2TimerQueue定时器290

8.2.1 TimerQueue class290

8.2.2 EventLoop的改动292

8.3 EventLoop::runInLoop()函数293

8.3.1提高TimerQueue的线程安全性296

8.3.2 EventLoopThread class297

8.4实现TCP网络库299

8.5TcpServer接受新连接303

8.5.1 TcpServer class304

8.5.2 TcpConnection class305

8.6TcpConnection断开连接308

8.7 Buffer读取数据313

8.7.1 TcpConnection使用Buffer作为输入缓冲314

8.7.2 Buffer::readFd()315

8.8 TcpConnection发送数据316

8.9完善TcpConnection320

8.9.1 SIGPIPE321

8.9.2 TCP No Delay和TCP keepalive321

8.9.3 WriteCompleteCallback和HighWaterMarkCallback322

8.10多线程TcpServer324

8.11 Connector327

8.12 TcpClient332

8.13 epoll333

8.14测试程序一览336

第3部分 工程实践经验谈337

第9章 分布式系统工程实践339

9.1我们在技术浪潮中的位置341

9.1.1分布式系统的本质困难343

9.1.2分布式系统是个险恶的问题344

9.2分布式系统的可靠性浅说349

9.2.1分布式系统的软件不要求7x24可靠352

9.2.2“能随时重启进程”作为程序设计目标354

9.3分布式系统中心跳协议的设计356

9.4分布式系统中的进程标识360

9.4.1错误做法361

9.4.2正确做法362

9.4.3 TCP协议的启示363

9.5构建易于维护的分布式程序364

9.6为系统演化做准备367

9.6.1可扩展的消息格式368

9.6.2反面教材:ICE的消息打包格式369

9.7分布式程序的自动化回归测试370

9.7.1单元测试的能与不能370

9.7.2分布式系统测试的要点373

9.7.3分布式系统的抽象观点374

9.7.4一种自动化的回归测试方案375

9.7.5其他用处379

9.8分布式系统部署、监控与进程管理的几重境界380

9.8.1境界1:全手工操作382

9.8.2境界2:使用零散的自动化脚本和第三方组件383

9.8.3境界3:自制机群管理系统,集中化配置386

9.8.4境界4:机群管理与naming service结合389

第10章 C++编译链接模型精要391

10.1 C语言的编译模型及其成因394

10.1.1为什么C语言需要预处理395

10.1.2 C语言的编译模型398

10.2 C++的编译模型399

10.2.1单遍编译399

10.2.2前向声明402

10.3 C++链接(linking)404

10.3.1函数重载406

10.3.2 inline函数407

10.3.3模板409

10.3.4虚函数414

10.4工程项目中头文件的使用规则415

10.4.1头文件的害处416

10.4.2头文件的使用规则417

10.5工程项目中库文件的组织原则418

10.5.1动态库是有害的423

10.5.2静态库也好不到哪儿去424

10.5.3源码编译是王道428

第11章 反思C++面向对象与虚函数429

11.1朴实的C++设计429

11.2程序库的二进制兼容性431

11.2.1什么是二进制兼容性432

11.2.2有哪些情况会破坏库的ABI433

11.2.3哪些做法多半是安全的435

11.2.4反面教材:COM435

11.2.5解决办法436

11.3避免使用虚函数作为库的接口436

11.3.1 C++程序库的作者的生存环境437

11.3.2虚函数作为库的接口的两大用途438

11.3.3虚函数作为接口的弊端439

11.3.4假如Linux系统调用以COM接口方式实现442

11.3.5 Java是如何应对的443

11.4动态库接口的推荐做法443

11.5以boost::function和boost::bind取代虚函数447

11.5.1基本用途450

11.5.2对程序库的影响451

11.5.3对面向对象程序设计的影响453

11.6 iostream的用途与局限457

11.6.1 stdio格式化输入输出的缺点457

11.6.2 iostream的设计初衷461

11.6.3 iostream与标准库其他组件的交互463

11.6.4 iostream在使用方面的缺点464

11.6.5 iostream在设计方面的缺点468

11.6.6一个300行的memory buffer output stream476

11.6.7现实的C++程序如何做文件IO480

11.7值语义与数据抽象482

11.7.1什么是值语义482

11.7.2值语义与生命期483

11.7.3值语义与标准库488

11.7.4值语义与C++语言488

11.7.5什么是数据抽象490

11.7.6数据抽象所需的语言设施493

11.7.7数据抽象的例子495

第12章 C++经验谈501

12.1用异或来交换变量是错误的501

12.1.1编译器会分别生成什么代码503

12.1.2为什么短的代码不一定快505

12.2不要重载全局::operator new()507

12.2.1内存管理的基本要求507

12.2.2重载::operator new()的理由508

12.2.3::operator new()的两种重载方式508

12.2.4现实的开发环境509

12.2.5重载::operator new()的困境510

12.2.6解决办法:替换malloc()512

12.2.7为单独的class重载::operator new()有问题吗513

12.2.8有必要自行定制内存分配器吗513

12.3带符号整数的除法与余数514

12.3.1语言标准怎么说515

12.3.2 C/C++编译器的表现516

12.3.3其他语言的规定516

12.3.4脚本语言解释器代码517

12.3.5硬件实现521

12.4在单元测试中mock系统调用522

12.4.1系统函数的依赖注入522

12.4.2链接期垫片(link seam)524

12.5慎用匿名namespace526

12.5.1 C语言的static关键字的两种用法526

12.5.2 C++语言的static关键字的四种用法526

12.5.3匿名namespace的不利之处527

12.5.4替代办法529

12.6采用有利于版本管理的代码格式529

12.6.1对diff友好的代码格式530

12.6.2对grep友好的代码风格537

12.6.3一切为了效率538

12.7再探std::string539

12.7.1直接拷贝(eager copy)540

12.7.2写时复制(copy-on-write)542

12.7.3短字符串优化(SSO)543

12.8用STL algorithm轻松解决几道算法面试题546

12.8.1用next_permutation()生成排列与组合546

12.8.2用unique()去除连续重复空白548

12.8.3用{make,push,pop﹜_heap()实现多路归并549

12.8.4用partition()实现“重排数组,让奇数位于偶数前面”553

12.8.5用lower_bound()查找IP地址所属的城市554

第4部分 附录559

附录A 谈一谈网络编程学习经验561

附录B 从《C++ Primer(第4版)》入手学习C++579

附录C 关于Boost的看法591

附录D 关于TCP并发连接的几个思考题与试验593

参考文献599

热门推荐