线程池原理与实现

B站讲解视频:线程池原理与实现

线程池

线程池是什么

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。

线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

阅读更多

C++基础(三)指针

指针是一个变量,其存储的是值的地址,而不是值本身

使用常规变量时,值是指定的量,而地址是派生量,而指针相反

OOP强调的是在运行阶段(而不是编译阶段)进行决策,提供了灵活性,对于内存管理也更加高效

阅读更多

STL基础

六大部件

stl_items.png

分配器:为容器分配内存

迭代器:算法只能通过迭代器访问容器

阅读更多

C++基础(五) 字符串、向量和数组

标准库类型String

读写string对象

1
2
3
string s;
cin >> s; //from empty to empty
getline(cin,s); //one line, stop by ENTER

当把string对象和字符(串)字面值混在一条语句时,必须确保加法运算符(+)两侧的运算对象至少一个是string

阅读更多

C++基础(八) 模版

模版函数(template function)为声明不是定义,在使用时根据输入类型定义

使用模版时,不会使用隐式类型转换

类模版里的每个函数都是函数模版,需要在声明前加上template

1
2
3
4
5
template <typename elemType>
class BinaryTree{
private:
BTnode<elemType> *_root;
}
阅读更多

C++基础(六) 表达式

后置递增运算符的优先级高于解引用运算符,因此*p++等同于*(p++)

将p+1后返回p的初始值

阅读更多

第六章 异常处理

当执行throw时,throw后的语句都不执行,控制权转移到与之对应的catch模块

退出catch后,catch模块中的局部变量将会销毁

当异常处理完毕后,异常对象将被销毁

1
2
3
4
5
6
7
try{
//...
}catch (exception_a){
//...
}catch (exception_b){
//...
}
阅读更多

C++基础(一) 基础知识

C++编译过程

  1. 预处理(Preprocessing)

    将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的。(include只做文本插入,在include的位置将头文件展开)

  2. 编译(Compilation)

    这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定**汇编代码(assembly code)**的过程。

    一个cpp文件是一个编译单元。

阅读更多

面向对象编程(二) 引用

引用的其他用法

引用作为成员变量

函数返回引用,可以将返回值做左值

拷贝构造

通过类的其他对象初始化当前对象(有默认拷贝构造方法,成员对成员的拷贝,可能发生对象的嵌套拷贝)

阅读更多

面向对象编程(一)基础知识

类不是实体,对象是实体

成员变量(filed)属于对象

成员函数(member function)属于类

初始化列表

列表初始化(initialize list)仅对成员变量初始化。

在构造函数里对成员变量初始化则为先初始化(默认)后赋值,故所有成员变量必须要有默认的初始化方法(成员变量包含其他类但该类没有默认构造函数则会报错)。构造函数无法主动调用。

尽量使用列表初始化

1
2
3
4
5
6
class A{
public:
int a;
A(int i):a(i){}; //initialize list
// A(int i):{a=i;}
};
阅读更多

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.