能接触这本书是因为上一个项目是用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. 判断是手机还是PC端访问

    /*判断手机*/ //判断是手机浏览还是pc //平台.设备和操作系统 var system = { win: false, mac: false, xll: false, ipad: false } ...

  2. EasyUI TextBox的onkeypress事件

    关于EasyUI TextBox的事件好像不多,像keypress,keydown在textbox的事件里都没有,所以要用这些事件要采取一些特殊的方法,今天用到了这些就记录一下,有两种方法 方法1: ...

  3. mongodb 的备份恢复导入与导出

    导入导出 use hndb; db.s.save({name:'李四',age:18,score:80,address:'郑州'}); db.s.save({name:'李三',age:8,score ...

  4. rabbitMQ学习(六)

    请求模式 客户端: import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; impor ...

  5. C++:名字查找先于类型检查

    Sub-Title: Name Hiding. "In C++, there is no overloading across scopes - derived class scopes a ...

  6. jdbk应用实例

    首先要在数据库中建好表,表的属性要跟代码中的一致 使用jdbk连接数据库,并且进行增删改查的操作(curd). package com.beiwi; import java.sql.Connectio ...

  7. mobx源码解读1

    mobx是redux的代替品,其本身就是一个很好的MVVM框架.因此花点力气研究一下它. 网上下最新的2.75 function Todo() { this.id = Math.random() mo ...

  8. stapes文档翻译

    1.引言 写一个Stapes 模型如下:    2.创建方法 这些方法用来帮助创建和扩展类或模块.这些术语在文档中可交换的. subclass Module.subclass([object]) st ...

  9. Shell 的变量功能

    搜寻路径PATH(系统预设变量) 执行命令时,系统透过PATH得路径顺序搜寻指令,如果再搜寻完后还找不到该指令,就会打印错误讯息[command not fount].   环境变量 进入shell之 ...

  10. nagios二次开发(五)---nagios和nagiosql的关系

    根据对nagios和nagiosql的了解,笔者简要的将二者的关系粗略的梳理了一下,具体情况如下图所示: 从上面的关系图中可以看出,nagios与nagiosql共享了主机.主机组.服务.服务组等.c ...