能接触这本书是因为上一个项目是用c++开发基于Linux的消息服务器,公司没有使用第三方的网络库,卷起袖子就开撸了。个人因为从业经验较短,主 要负责的是业务方面的编码。本着兴趣自己找了这本书。拿到书就简单的翻了下,看到是基于c++11标准的,用到了智能指针、bind/function等 工具。因为对c++11不是很了解再加上表较忙就搁置下来了。现在借着项目的空档期,拜读了陈硕的这本关于服务端多线程开发的书,选取了一些自己比较感兴趣的章节,有些进行了比较深度的阅读,如对象生命期的管理和线程同步、有些则是粗略的浏览了一遍。

  个人觉得读一些书,需要真正的静下心来,这样的效率才能有保证。想获取知识浮躁的心态是要不得的,而且在读书当中应该对重点进行特殊对待。其他的则可以略读或干脆不读。总之一个原则:将精力主要集中在重点知识上去。

  如何在读书的时候把心静下来,暂时还不得要领!需要继续观察总结。在没有更好的方法前只能是先去读书,在读书的过程中达到心静的状态。

1. 多线程编程

  个人认为c++多线程的难点与重点就在

  (1) 共享资源的安全使用

    对象在构造期的线程安全:

      线程A: 在构造期这时如果将对象a注册到另外一个对象b中。 在此时另外一个线程B:对象吧调用方法使用到线程A中注册的对象,这个时候是不能保证对象的完整性的。就算将注册函数的调用放在构造函数的结尾处,还要考虑到这个类是否被继承,如果被继承得到的对象将是不完整的(派生类的对象还没有构造出来)。

      解决方法:将对象的注册放到初始化函数中。不在构造期将对象暴露出去。

    对象在使用中的线程安全:

    要想安全的使用共享资源,就需要用到线程同步的知识。

    线程同步方法:互斥量、条件变量、信号量、读写锁

    书中推荐使用互斥量和条件变量就基本可以解决所有遇到的同步问题,个人也很认同。也就把精力放在了互斥量和条件变量的学习上了。

    对象在析构时的线程安全:
            保证在对象析构时的线程安全是比较麻烦的时,因为在c++中我们没有方法判断对象是否是有效的。通过对对象加锁达不到多线程的安全性,因为在析构的时候对象多持有的锁在析构时就结束了它的生命期。
            书中给出的办法是通过智能指针,当指针的引用计数小于0时对象被析构。
            使用智能指针时需要避开智能指针的一些坑例如循环引用,智能指针不是多线程安全的使用时需要加锁。

  (2) 性能
        这个方面了解的比较少,现在知道的是:
        1) 控制锁的粒度  
        2)线程调度,控制线程的数量,在程序运行中不频繁的创建、销毁线程,安排好线程的职责:专门负责I/O的线程、专门负责计算的线程、第三方库的线程
    
2. 值语义与数据抽象,几个概念
    值语义指的是对象的拷贝与原对象无关,拷贝后与原对象脱离关系。
    与值语义对应的是对象语义或叫引用语义。指的是面向对象意义下的对象,对象拷贝是禁止的。
    数据抽象,用来描述(抽象)数据结构的。
    
    数据抽象、面向对象、基于对象的区别
        面向对象有3大特征:封装、继承、多态。
        而基于对象则只有封装没有继承和多态,即只有具体类没有抽象借口。它们都是对象语义。
        数据抽象是针对“数据“的,这意味着ADT(抽象数据类型)class应该可以拷贝。它是值语义。
    面向对象真正核心思想是消息传递,”封装继承多态“只是表象。具体参考 http://blog.csdn.net/myan/article/details/5928531    function/bind的救赎(上) 作者: 孟岩

参考文章:
    【1】《Linux多线程服务端编程:使用c++muduo网络库》 作者:陈硕

Linux多线程服务端编程一些总结的更多相关文章

  1. 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

    <Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...

  2. 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

    <Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...

  3. 《Linux多线程服务端编程》笔记——多线程服务器的适用场合

    如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...

  4. 《Linux多线程服务端编程》笔记——线程同步精要

    并发编程基本模型 message passing和shared memory. 线程同步的四项原则 尽量最低限度地共享对象,减少需要同步的场合.如果确实需要,优先考虑共享 immutable 对象. ...

  5. 一、智能指针及线程同步总结------linux多线程服务端编程

    更新2.0 二.多线程及服务器编程总结------linux多线程服务端编程 https://www.cnblogs.com/l2017/p/11335609.html 三.分布式编程总结------ ...

  6. Linux多线程服务端编程:使用muduo C++网络库

    内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这 ...

  7. 《Linux多线程服务端编程——使用muduo C++网络库》读书笔记

    第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线 ...

  8. <Linux多线程服务端编程>学习记录

    使用智能指针解决多线程下 类的解析冲突问题 有这样一个场景 使用StockFactory记录Stock的信息  容器是map<string,smart_ptr>; 代码如下: #inclu ...

  9. Linux多线程服务端编程 使用muduo C++网络库 学习笔记 日志log

    代码来自陈硕开源代码库 muduo中 地址是https://github.com/chenshuo/muduo #pragma once #include <string> #define ...

随机推荐

  1. delphi中break,continue, exit,abort, halt, runerror的异同

    delphi中表示跳出的有break,continue, exit,abort, halt, runerror. 1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或re ...

  2. AIX 环境下Telnet返回提示所有端口已经被占用,处理方法

    IBM AIX v5.3操作系统环境Telnet返回提示所有端口已经被占用 可以按以下步骤进行检查和处理 1,以下命令检查pty0是否可用 #lsdev -Cl pty0 2,以下命令检查telnet ...

  3. [转载]我的WCF之旅(1):创建一个简单的WCF程序

    为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...

  4. javascript对象引用与赋值

    avascript对象引用与赋值 <script type="text/javascript"> //例子一: 引用 var myArrayRef = new Arra ...

  5. U盘安装WIN10专业版

    安装环境1个SSD,2个SATA盘. 安装时把2个SATA盘拔掉,并使SSD在BISO中的地位为0区的MASTER,否则安装时会出现,无法创建当前分区,和新建当前分区. 步骤:下载win10正式专业版 ...

  6. java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ProgressBar$SavedState

    java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.Progress ...

  7. laravel框架学习

    在聊技术之前,我们首先谈谈研究生的生活现状.进入到研究生忙碌的生活中,研究生是这么一个群体,外界对研究生的爱称是"研究僧",为什么我自己会觉得会是爱称.因为研究僧说的是研究生对自己 ...

  8. python 继承中的super

    python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

  9. 查看linux中某个端口是否被占用

    1.netstat -tunlp | grep **** -t--tcp  -u--udp -l--listening -n --numeric -p--program -a--all 2.lsof ...

  10. spring 的aop proxy 代理

    前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门写此篇帖子分析why. 1.预备知识 aop概 ...