• 推荐《Linux 多线程服务器端编程》


    赖勇浩(http://laiyonghao.com

    最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书。我推荐了《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++,跟上它的发展,这对于我编写、学习其它编程语言也极有指导意义。当然,对于我朋友这种从客户端转过来服务器端的程序员来说,最重要的是能够快速地写出“正统的”服务器端代码了。
  • 相关阅读:
    2022 flag 150篇文章 63 ES elastic search
    2022 flag 150编文章 005 java 网络编程
    2022 flag 150篇文章 91 分布式系统协调服务 分布式基础
    2022 flag 150篇文章 50 PMP
    2022 flag 150篇文章 61 消息队列 Kafka
    2022年1月最新最全的微前端框架调研
    sqlconnection,sqlcommand,sqldataadapter,sqldatareader,dataset的关系详解
    [日常] 解决docker拉取镜像速度慢的问题
    jupyter notebook下python2和python3共存(kali)
    Jboss弱密码及反序列化漏洞
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154302.html
Copyright © 2020-2023  润新知