线程池原理与实现
B站讲解视频:线程池原理与实现
线程池
线程池是什么
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。
线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
B站讲解视频:线程池原理与实现
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。
线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
指针是一个变量,其存储的是值的地址,而不是值本身
使用常规变量时,值是指定的量,而地址是派生量,而指针相反
OOP强调的是在运行阶段(而不是编译阶段)进行决策,提供了灵活性,对于内存管理也更加高效
读写string对象
1 | string s; |
当把string对象和字符(串)字面值混在一条语句时,必须确保加法运算符(+)两侧的运算对象至少一个是string
模版函数(template function)为声明不是定义,在使用时根据输入类型定义
使用模版时,不会使用隐式类型转换
类模版里的每个函数都是函数模版,需要在声明前加上template
1 | template <typename elemType> |
当执行throw时,throw后的语句都不执行,控制权转移到与之对应的catch模块
退出catch后,catch模块中的局部变量将会销毁
当异常处理完毕后,异常对象将被销毁
1 | try{ |
预处理(Preprocessing)
将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的。(include只做文本插入,在include的位置将头文件展开)
编译(Compilation)
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定**汇编代码(assembly code)**的过程。
一个cpp文件是一个编译单元。
类不是实体,对象是实体
成员变量(filed)属于对象
成员函数(member function)属于类
列表初始化(initialize list)仅对成员变量初始化。
在构造函数里对成员变量初始化则为先初始化(默认)后赋值,故所有成员变量必须要有默认的初始化方法(成员变量包含其他类但该类没有默认构造函数则会报错)。构造函数无法主动调用。
尽量使用列表初始化
1 | class A{ |