要点 1.服务器程序通常需要处理三类事件:I/O事件,信号及定时事件。有两种事件处理模式: Reactor模式:要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生(可读、可写),若有,则立即通知工作线程(逻辑单元),将socket可读可写事件放入请求队列,交给工作线程处理。 Proactor模式:将所有的I/O操作都交给主线程和内核来…
More content:LeetCode hot100@二叉树 257. 二叉树的所有路径❌ 递归回溯 递归三步走,但要注意在二叉树的递归中单层逻辑一般要包括中左右三部分(顺序依前中后遍历而定) class Solution { public: void traversal(TreeNode *cur, vector<string> …
概述 优点: 开源 精简 支持跨平台 专注于网络通信 源码包安装步骤:可参考具体README文件 ./configure检查安装环境,生成makefile make生成.o和可执行文件 sudo make install 将必要的资源拷贝至系统指定目录 进入sample目录,运行demo验证是否安装成功 编译使用库的.c时,需要加-levent选项…
More content:力扣题记之二叉树 链式存储的二叉树节点定义方式: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 二叉树递归求深度用前序,求高度用后序 C+…
线程池并发服务器 为什么要引入线程池,不直接用之前的多线程并发? 因为多线程并发要频繁地对线程进行创建与销毁(一旦有客户端传来需求,就创建一个新线程,通信结束就立刻销毁该线程),这会占用大量的CPU时间并导致不必要的系统开销 相关结构体 线程池结构体:描述线程池相关信息 pthread_mutex_t lock; /* 用于锁住本结构体 */ pt…
单链表定义方式: struct ListNode { int val; // 节点上存储的元素 ListNode *next; // 指向下一个节点的指针 ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 }; STL链表:list<int> mylist; 是一个双向循环链表,不需要关心节…
73. 矩阵置零✅ Solution1:先把零的位置找出来,用二维数组存起来,但这样额外空间是O(mn) Solution2改进:仅使用常量空间,即O(1) class Solution1 { public: void setZeroes(vector<vector<int>>& matrix) { int m = …
C++ Array/Vector 二分 int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, righ…
1 C++初识 1.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开 1.1.2 创建文件 右键源文件,选择添加->新建项 给C++文件起个名称,然后点击添加即可。 1.1.3 编写代码 #inc…
1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放全局变量、静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值、局部变量等 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 内存四区意义: 不同区域存放的数据,赋予不同的生命周期, 增加编…