元数据
C++服务器开发精髓
- 书名: C++服务器开发精髓
- 作者: 张远龙
- 简介: 本书从操作系统原理角度讲解进行C++服务器开发所需掌握的技术栈。全书总计9章,第1~2章讲解C++11/14/17新标准中的常用特性、新增类库,以及C++开发者必须熟练掌握的开发调试工具链;第3~6章详细讲解C++服务器开发中的多线程编程技术、网络编程重难点知识、网络故障调试与排查常用工具,以及通信协议的设计思路、技巧;第7~8章详细讲解一个带网络通信组件的高性能服务的基本设计思路和注意事项;第9章进一步补充服务相关的常用模块设计思路和方法。本书秉承的思想是,通过掌握技术原理,可以轻松制造“轮子”,灵活设计出优雅、鲁棒的服务,并快速学习新技术。
- 出版时间: 2021-06-01 00:00:00
- ISBN: 9787121412639
- 分类: 计算机-编程设计
- 出版社: 电子工业出版社
- PC地址:https://weread.qq.com/web/reader/75532610725a6947755100d
高亮划线
1.10 stl容器新增的实用方法
📌 ok-idiom模式 ⏱ 2021-12-13 19:21:40
1.11 stl中的智能指针类详解
📌 并不是所有对象的std::move操作都有意义,只有实现了移动构造函数(Move Constructor)或移动赋值运算符(operator=)的类才行 ⏱ 2021-12-13 19:27:35
📌 一个资源的生命周期可以交给一个智能指针对象来管理,但是该智能指针的生命周期不可以再交给该资源来管理。 ⏱ 2021-12-13 21:59:12
📌 std::weak_ptr是一个不控制资源生命周期的智能指针,是对对象的一种弱引用,只提供了对其管理的资源的一个访问手段,引入它的目的是协助std::shared_ptr工作。 ⏱ 2021-12-13 21:59:20
📌 因此,std::weak_ptr的正确使用场景是引用的资源如果可用就使用,不可用就不使用,不参与资源的生命周期管理。 ⏱ 2021-12-13 22:01:14
📌 在通常情况下,如果我们的资源不需要在其他地方共享,就应该优先使用std::unique_ptr,反之使用 std::shared_ptr。当然,这是在该智能指针需要管理资源的生命周期的情况下进行的;如果不需要管理对象的生命周期,则请使用std::weak_ptr。 ⏱ 2021-12-13 22:06:42
2.5 gdb常用命令详解——利用gdb调试Redis
📌 ;对于 C++项目,使用的编译器一般是g++,相应的编译器选项是CXXFLAGS,请注意区别 ⏱ 2021-12-13 22:19:46
2.6 使用gdb调试多线程程序
📌 gdb提供了一个将程序执行流锁定在当前调试线程中的命令选项——scheduler-locking,这个选项有三个值,分别是on、step和off,使用方法如下: ⏱ 2021-12-14 10:27:00
📌 set scheduler-locking on可以用来锁定当前线程,只观察这个线程的运行情况,锁定这个线程时,其他线程处于暂停状态,也就是说,在当前线程执行next、step、until、finish、return命令时,其他线程是不会运行的。 ⏱ 2021-12-14 10:27:25
📌 set scheduler-locking step也用来锁定当前线程,当且仅当使用next或step命令做单步调试时会锁定当前线程, ⏱ 2021-12-14 10:27:33
2.7 使用gdb调试多进程程序——以调试Nginx为例
📌 gdb调试器提供了一个follow-fork选项,通过set follow-fork mode设置一个进程fork出新的子进程时,gdb是继续调试父进程(取值是parent)还是继续调试子进程(取值是child),默认继续调试父进程(取值是parent) ⏱ 2021-12-14 10:29:15
2.8 gdb实用调试技巧
📌 。我们用gdb调试这个程序时,由于Ctrl+C信号默认会被gdb接收(让调试器中断),所以导致我们无法模拟程序接收这一信号。 ⏱ 2021-12-14 10:30:24
📌 在gdb中使用signal函数手动向我们的程序发送信号, ⏱ 2021-12-14 10:30:30
📌 改变gdb信号处理的设置,通过handle SIGINT nostop print告诉gdb在接收到SIGINT时不要停止,并把该信号传递给目标调试程序 ⏱ 2021-12-14 10:30:38
📌 。添加条件断点的命令是break [lineNo] if [condition],其中lineNo 是程序触发断点后需要停的位置,condition 是断点触发的条件。 ⏱ 2021-12-14 10:33:02
📌 添加条件断点还有一种方法,就是先添加一个普通断点,然后使用“condition 断点编号 断点触发条件”这样的格式来添加。 ⏱ 2021-12-14 11:45:35
3.2 线程的基本操作
📌 ,这个函数的调用方式必须是__cdecl,这是C Declaration的缩写,__cdecl是在C/C++中定义全局函数时默认的调用方式。 ⏱ 2021-12-14 11:51:18
📌 C++11新标准引入了一个新的类std::thread(需要包含头文件
),使用这个类可以将任意签名形式的函数作为线程函数。 ⏱ 2021-12-14 12:01:05 ^39479623-31-5436-5505
📌 ,std::thread 在使用上容易出错,即std::thread 对象在线程函数运行期间必须是有效的。 ⏱ 2021-12-14 12:03:06
📌 线程ID在整个操作系统范围内是唯一的。 ⏱ 2021-12-14 12:06:21
📌 在Linux系统中可以通过pstack命令查看一个进程的线程数量和每个线程的调用堆栈情况 ⏱ 2021-12-14 12:06:51
📌 使用这个函数时,必须保证该线程处于运行状态,也就是说等待的线程必须是可以 join 的,如果需要等待的线程已经退出,则此时调用 join 方法,程序就会崩溃。因此,C++11 的线程库同时提供了一个 joinable 方法来判断某个线程是否可以join。 ⏱ 2021-12-15 10:38:02
3.3 惯用法:将C++类对象实例指针作为线程函数的参数
📌 如果使用 C++11 的 std::thread 类,就没有这个限制,即使类成员函数是类的实例方法也可以,但必须显式地将线程函数所属的类对象实例指针(在类的内部就是 this指针)作为构造函数参数传递给std::thread,这时还需要传递类的this指针,这在本质上是一样的 ⏱ 2021-12-15 10:39:10