推荐《Linux 多线程服务器端编程》
最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《Linux 多线程服务器端编程——使用 muduo C++ 网络库》给他,他在网上书店看了以后问我为什么推荐这么厚一本书给他,正好这本书我已经早就看完了,一直也想写篇“书评”,就在这里多扯几句。其实实在算不上书评,原因有二:一是读书的时候囫囵吞枣,理解不够深刻,不深刻自然不能评;二是这几年虽然在 Linux 下写服务器端的网络程序,但很少用多线程,也很少用 C++,书里谈的东西,算是不熟悉的领域,自然也不能乱评。所以今天这篇,应当是推荐,是为陈硕老师背书。
这本书展示了使用 C++、多线程进行网络编程的许多最佳实践,甚至称为标准做法也不为过。比如当谈到 C++ 的内存管理问题的时候,以“不配对的 new[]/delete”为例,用“把 new[] 统统替换为 std::vector/scoped_array”为解决方案,提出使用“智能指针”解决大部分内存问题,堪称金玉良言。又比如当谈到“如何限制并发连接数”时,作者直接引用了 libev 作者 Marc Lehmann 提出的几个方案,并另外给出一个更为简单的方案。
这些最佳实践的意义在于,当你读完了 APUE 和 UNP,却发现自己写出来的网络程序完全不堪商用,然后花费了许多日日夜夜修补业务漏洞、内存泄漏、并发性能,勉强支撑了公司业务以后,读到此书时那种相见恨晚的感觉。你会发现虽然自己身经百战,但是仍然能够从书中找到自己完全不了解的“常识”;对你来说,也许最大的欣慰就是觉得以后团队新人终于有一本实践指南,可以让新人快速成长起来,不用再一次趟过你已经趟过的坑。
这本书展示了好的代码,特别是好的 C++ 代码。从来不缺乏 C++ 的批评之声,但是 C++ 应当怎么用,如何写 C++ 才是现代的、真正的 C++,在此书之前,几乎从来没有成体系的讲法。我参与过一些 C++ 项目的编程,也见过许多技术负责人一边视 boost 为洪水猛兽,甚至对 STL 也避之不及,却又一边自行制造同样目的、质量差强人意的山寨版轮子。作者非常理性地看待 C++,约束自己对其特性的使用,并提出“朴素的 C++ 设计”理念,在编程中挑选 boost 库中久经考验的、优秀的子库善加应用,比如“使用 boost::function 和 boost::bind 取代虚函数”,减少代码的同时获得非常可靠的代码质量,是非常值得我们学习借鉴的。
这本书展示了基础的重要性。直接读,可以发现很多章节讲的内容都可以说是常识,但是作为一名久经考验的程序员,可以说,我觉得这里面讲的常识都是“一不留神坑死你”的。比如“shared_ptr 技术与陷阱”一节中,作者提到析构的线程不一定是是对象诞生的线程,我的膝盖就中过一箭。当时我为一个动作游戏编写非玩家角色的人工智能,在游戏中,大部分 CPU 资源都被用在图形渲染上,留给人工智能的资源非常有限,我又要做计算量超大的团队人工智能,所以很“卡”。后来的优化方案是把内存释放操作放到另一条线程去执行,虽然当时没有使用 shared_ptr,但因为问题的原因和解决方案都是一样的,如果我们当时都读过这本书,应该不会踏入这个坑。如果有出身草莽的野路子程序员,读一下这本书,应该还是大有补益的。
这本书展示了对业务理解的重要性。无论是 muduo 库,还是这本书,都没有想做到面面俱到。对于 muduo,作者追求的是完成业务领域的需求,并压榨硬件的极限;对于这本书,作者讲求的是“经验与实践”,并没有把这本书写成枕头书,而是把“应当注意的、我这样做的理由”讲得通透。说老实话,读这本书,感觉到作者就像一对一的培训那么贴心。
虽然我从 2013 年起,以 web 开发和团队管理工作为主,已经不写基于 TCP 协议的服务器端程序,甚至“几乎不使用 C++”三年了,但阅读这本书仍然极有意义:一是理解 Linux 关于网络方面的新特性,这一块对我现在做基于 HTTP 协议的开发工作也是极有帮助的;二是理解多线程的最佳实践,其实工作中免不了多少要跟多线程打交道,掌握这方面的最佳实践,在遇到使用场景时,可以马上给出“没大错”的方案;三是理解 C++,跟上它的发展,这对于我编写、学习其它编程语言也极有指导意义。当然,对于我朋友这种从客户端转过来服务器端的程序员来说,最重要的是能够快速地写出“正统的”服务器端代码了。
推荐《Linux 多线程服务器端编程》的更多相关文章
- 《Java多线程编程核心技术》推荐
写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- Java多线程编程核心技术(一)Java多线程技能
1.进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程. 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位. 举个例子: 打开你的计算机上的任务管 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- 《java多线程编程核心技术》(一)使用多线程
了解多线程 进程和多线程的概念和线程的优点: 提及多线程技术,不得不提及"进程"这个概念.百度百科对"进程"的解释如下: 进程(Process)是计算机中的程序 ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- Thread.currentThread()和this的区别——《Java多线程编程核心技术》
前言:在阅读<Java多线程编程核心技术>过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解. 具体代码如下: pub ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
随机推荐
- 《C陷阱与缺陷》读书笔记
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...
- python install 2.7.10
CentOS 6.5升级Python和安装IPython 后来换成了CentOS 6.5,系统自带的Python版本是2.6.6. 图一:安装IPython需求 已经安装好gcc等编译工具.系统自带P ...
- (转)Java关键字final、static使用总结
一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...
- 【转】Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...
- LeetCode(2) - Add Two Numbers
一道比较基本的LinkedList的题目.题目要求是这样,现在有两个LinkedList,(2 -> 4 -> 3)和(5 -> 6 -> 4),然后从头开始,把每个node ...
- 用LinkedHashMap实现LRU算法
(在学习操作系统时,要做一份有关LRU和clock算法的实验报告,很多同学都应该是通过数组去实现LRU,可能是对堆栈的使用和链表的使用不是很熟悉吧,在网上查资料时看到了LinkedHashMap,于是 ...
- POJ 1696 Space Ant(极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2489 Accepted: 1567 Descrip ...
- ESB的XmlProPertyMgr类的getNode(xxx)方法
//------------------------------------------------------------------------------ public static Eleme ...
- redhat6.4升级openssh至6.7
1:简介 最近浙江电信对线上服务器进行漏洞扫描,暴露出原有的openssh有漏洞,建议升级openssh版本: 2:操作环境 Red Hat Enterprise Linux Server relea ...
- Cisco SDM
SDM连接方式:http+telnet / https+ssh 要使用SDM对CISCO设备实现集中式管理,必须在设备上键入如下命令: 步骤1: 要启用路由器的HTTP/HTTPS 服务器,请 ...