Linux多线程服务端编程一些总结
能接触这本书是因为上一个项目是用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多线程服务端编程一些总结的更多相关文章
- 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
<Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...
- 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
<Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...
- 《Linux多线程服务端编程》笔记——多线程服务器的适用场合
如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...
- 《Linux多线程服务端编程》笔记——线程同步精要
并发编程基本模型 message passing和shared memory. 线程同步的四项原则 尽量最低限度地共享对象,减少需要同步的场合.如果确实需要,优先考虑共享 immutable 对象. ...
- 一、智能指针及线程同步总结------linux多线程服务端编程
更新2.0 二.多线程及服务器编程总结------linux多线程服务端编程 https://www.cnblogs.com/l2017/p/11335609.html 三.分布式编程总结------ ...
- Linux多线程服务端编程:使用muduo C++网络库
内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这 ...
- 《Linux多线程服务端编程——使用muduo C++网络库》读书笔记
第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线 ...
- <Linux多线程服务端编程>学习记录
使用智能指针解决多线程下 类的解析冲突问题 有这样一个场景 使用StockFactory记录Stock的信息 容器是map<string,smart_ptr>; 代码如下: #inclu ...
- Linux多线程服务端编程 使用muduo C++网络库 学习笔记 日志log
代码来自陈硕开源代码库 muduo中 地址是https://github.com/chenshuo/muduo #pragma once #include <string> #define ...
随机推荐
- OAF屏蔽的错误
ORACLE EBS中OAF屏蔽的错误 ORACLE EBS R12中引入了XML Publisher,Oracle Application Framework等新东西,利用网页/JSP技术增强For ...
- Flex使用Blazeds与Java交互及自定义对象转换详解-DATAGRID读取ORACLE数据
http://www.cnblogs.com/RocD-DuPeng/articles/1751040.html 一.建立Flex与Java交互的工程. 本文中讲到的交互是利用Blazeds的,因为这 ...
- android Spinner的简单用法
上代码: spinner = (Spinner) findViewById(R.id.spinner); tv = (TextView) findViewById(R.id.tv); final Ar ...
- spark配置lzo
spark1.0版本 spark-env.sh中 export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/soft/hadoop/lzo/lib/export S ...
- 循序渐进Python3(十一) --2-- web之javascript
JavaScrip JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之后 ...
- Ubuntu 16.10下的 jdk 1.8.0_111
下载好对应版本的jdk copy到此目录下,并解压: 呼出终端,输入指令: gedit ~/.bashrc 会出现文本编辑界 export JAVA_HOME=/usr/lib/jvm/jdk1.8. ...
- ubuntu 安装mysql-python和 python-ldap,navicate 问题
1.Ubuntu 下 pip install mysql-python 报错 EnvironmentError: mysql_config not found 原因是缺少mysqlclient 包,执 ...
- 关于c#的事件如何使用
c#的委托delegate事件的详细使用 一.无参数,无返回的委托事件 委托事件类.事件的发生源.1.声明委托 2定义事件 3具体方法 public class Test { // …. publi ...
- 纯js异步无刷新请求(只支持IE)
纯js异步无刷新请求 下载地址:http://pan.baidu.com/s/1slakL1F 所以因为非IE浏览器都禁止跨域请求,所以以只支持IE. <HTML> <!-- 乱码( ...
- table边框单线的实现方法
1.实现方法一: <table border="0" cellspacing="1" style=" 实现原理:利用table的单元 ...