回调函数 3 分钟彻底理解回调函数 | B 站 3 分钟搞懂回调函数 每个开发者都具备的基础能力 | B 站 『教程』回调函数是个啥? | B 站 1. 认识回调函数?1. 什么是回调函数?回调函数(Callback Function)是 函数指针的一种应用形式,它的核心思想是:“把函数作为参数传给另一个函数,由那个函数在合适的时机再调用它。” 通常用于 “别人调用你自己的函数”,你把函数地址传给某个函数,等它内部逻辑执行到某个阶段时,再“反过来”调用你传入的函数。换句话说: 你写函数 A(定义了“要做什么”)。 别人写函数 B(控制“什么时候做”)。 你把 A 的函数地址交给 B,B 内部“回头”去调用 A。这就是“回调”。 如果你还是不理解,那么我先在这里埋一个伏笔:对于我来说,回调函数虽然从英文翻译过来回调不太好理解,但是用过函数传参就能直接上手回调函数,它的用法就是将函数作为参数进行传递,传到对方函数中,类比变量一样被调用,这!就是回调函数,还是很好理解吧,后面来几个示例就能深入理解和上手啦。 2. 使用场景回调函数常用于以下几种情况: 事件驱动:如网络库 muduo ...
C++ 语言层面上的多线程 C++11 多线程 | 行码棋 1. C++11 的线程模型 vs pthread 的对应关系 pthread API C++11 对应写法 说明 pthread_create() std::thread(func, args...) 创建并启动线程 pthread_self() std::this_thread::get_id() 获取当前线程 ID pthread_join() t.join() 等待线程结束 pthread_detach() t.detach() 分离线程 pthread_exit() return 即可 函数返回自动结束线程 pthread_cancel() 无直接等价(需自定义退出标志) C++ 不建议 强制终止线程 pthread_mutex_* std::mutex / std::lock_guard 自动 RAII 锁管理 pthread_cond_* std::condition_variable 条件变量 2. 线程的使用1. 语法12std::thread t(fun ...
epoll 和 CMake 的使用1. epoll 简介epoll 是 Linux 系统提供的一种 IO 多路复用机制,用来替代传统的 select 和 poll。它的核心优势是: 高效:性能不会随着监听的文件描述符数量增加而下降。 内存友好:只返回就绪的事件,而不是遍历所有文件描述符。 支持边缘触发:可以更灵活地控制事件触发方式。 2. epoll 的三大函数epoll_create、epoll_ctl 和 epoll_wait 是 epoll 机制的三个核心函数,可以类比为: epoll_create():创建一个 epoll 实例(相当于创建一个事件监听器)。 epoll_ctl():管理要监听的文件描述符(添加、修改、删除监听列表中的 fd)。 epoll_wait():等待事件发生(阻塞等待,直到有事件发生或超时)。 这三兄弟的关系就像一个管理系统的三个操作: epoll_create():创建一个管理办公室。 epoll_ctl():向办公室登记/修改/删除要监控的员工(文件描述符)。 epoll_wait():在办公室等待,当有员工出事(事 ...
数据类型1. 常用数据类型一览 分类 数据类型 说明 数值类型 BIT(M) 位类型。M 指定位数,默认值 1,范围 1–64。 TINYINT [UNSIGNED] 很小的整数。带符号范围:-128 ~ 127;无符号范围:0 ~ 255。默认为有符号。 BOOL / BOOLEAN 布尔类型,是 TINYINT(1) 的同义词,0 表示 FALSE,非 0 表示 TRUE。 SMALLINT [UNSIGNED] 小整数。带符号范围:-32,768 ~ 32,767;无符号范围:0 ~ 65,535。 INT / INTEGER [UNSIGNED] 最常用的整数类型。带符号范围:-2,147,483,648 ~ 2,147,483,647;无符号范围:0 ~ 4,294,967,295。 BIGINT [UNSIGNED] 大整数。带符号范围:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807;无符号范围:0 ~ 18,446,744,073,709,551,61 ...
高级 IO Linux 高级 IO | CSDN 1. 正确认识 IO1. IO 的本质I/O(Input / Output)指的是 CPU 与外设之间的数据交互过程。在冯·诺依曼结构中,系统由:CPU(运算与控制)、内存(暂存数据与指令)、外设(磁盘、网卡、显示器、键盘等)组成。 I/O 就是:数据在「内存 ↔ 外设」之间的传输。所以: 输入(Input):外设 → 内存(例如:键盘输入、磁盘读文件、网卡收包)。 输出(Output):内存 → 外设(例如:屏幕显示、磁盘写文件、网卡发包)。 2. IO 的关键特征 慢:外设的速度远慢于 CPU 和内存。因此,IO 通常是性能瓶颈。 异步性:外设工作时 CPU 可去做别的事。操作系统通过 中断、DMA(直接内存访问) 来提高效率。 3. 文件 IO 与 网络 IO IO 类型 外设 操作系统抽象 本质 文件 IO 磁盘 文件描述符(fd) 把数据从磁盘读入内存或写出 网络 IO 网卡 套接字(socket) 把数据从网卡缓冲区读入内存或写出 对操作系统来说,一切皆文件,无论是磁 ...
Linux
未读其他重要协议和技术 DNS 协议、ICMP 协议、NAT 技术 | CSDN 1. DNS1. DNS 背景与作用 DNS(Domain Name System,域名系统) 是互联网中 负责把域名转换为 IP 地址 的系统。人记域名(如 www.baidu.com),机器识别 IP(如 110.242.69.21)。DNS 就是充当这两者之间的“翻译官”。 为什么需要 DNS? IP 地址难记、会变动,而域名容易记。 访问网站、发邮件、请求 API 时都依赖域名解析到具体主机。 2. 域名简介域名是分层结构(从右往左层级递减): 1234www.example.com.│ │ └── 顶级域(TLD):.com / .org / .cn / .edu│ └────────── 二级域(注册主体):example└────────────── 主机名(子域):www(可省略) 说明: 根域:隐藏的 “.”,由全球 13 组根 DNS 服务器管理。 顶级域(TLD):如 .com:商业类;.net:网络服务类;.org:开源组织或非盈利组织。 二级域:企 ...
表的操作1. 创建表1. 语法格式CREATE TABLE 用于在数据库中创建一张新的表,可以定义字段名、数据类型、约束等信息。 123456CREATE TABLE [IF NOT EXISTS] 表名 ( 列名1 数据类型 [列级约束], 列名2 数据类型 [列级约束], ... [表级约束]) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集] [COLLATE=校验规则]; 参数说明: 参数 说明 IF NOT EXISTS 如果表已存在则报错,没有才创建 数据类型 定义字段所能存储的数据类型,如 INT、CHAR、VARCHAR、DATE、FLOAT 等 列级约束 针对单个列的约束,如 NOT NULL、DEFAULT、AUTO_INCREMENT、PRIMARY KEY 表级约束 跨列的约束,如联合主键、外键等 ENGINE 存储引擎,如 InnoDB、MyISAM CHARSET 字符集,用于指定表所采用的 编码格式,如果没有指定则以所在数据库的编码格式为准。 COLLATE 字符比较 ...
库的操作1. 创建数据库1. 语法格式CREATE DATABASE 用于在 MySQL 中创建新的数据库,可以同时指定字符集(编码格式)和校验规则。 12CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET 字符集名] [DEFAULT COLLATE 校验规则];CREATE DATABASE [IF NOT EXISTS] 数据库名 [[DEFAULT] CHARSET=字符集名] [[DEFAULT] COLLATE=校验规则]; 其中带 [] 表示可选项,不写就会自动选择默认的配置。sql 语句也可以使用小写,会自动识别!在之后的讲解中,我会尽量使用多种写法来展示同一条 sql 语句的效果。 参数详解: 参数 说明 IF NOT EXISTS 如果没有就创建,如果已有同名的则报错:提示无法创建,因为已存在 DEFAULT CHARACTER SET 指定数据库的默认字符集(如 utf8、utf8mb4 等) DEFAULT COLLATE 指定校验规则,即字符串比较、排序方式 数据 ...
数据链路层 数据链路层协议 ——— 以太网协议 | CSDN 「网络编程」数据链路层协议_ 以太网协议学习 | CSDN 1. 对比理解 MAC 地址和 IP 地址1. 通俗类比:寄快递的两步走假设你要从北京家里寄一个文件到上海朋友家,整个过程对应两层的分工: 层级 类比角色 负责的环节 数据链路层 你家楼下的快递员 只负责 “本地最后一公里”:从你手里接过文件(数据),封装成 “本地快递袋”(帧),送到小区门口的 “物流站点”(路由器);不关心文件最终去哪,只认 “你家的门牌号”(MAC 地址)。 网络层 全国物流调度中心 负责 “跨区域全局路由”:从物流站点接过快递袋,拆开看 “目的地地址”(IP 地址),规划从北京到上海的路线(比如北京 → 济南 → 南京 → 上海),把快递转到下一个站点,直到送到上海的物流站点;不关心 “最后一公里怎么送”,只管 “跨区域怎么到目标城市”。 简言之: 数据链路层:管 “邻居间” 的本地传输(比如你家电脑 ↔ 路由器、路由器 ↔ 隔壁路由器)。 网络层:管 “跨网络” 的全局路由(比如北京内网 ↔ 上海内网、家里 WiFi ...
Linux
未读网络层 —— IP 协议 网络层协议 ——— IP 协议 | CSDN 网络层 IP 协议 | CSDN 为什么大家的 IP 都是 192.168 开头的?| B 站(荐) 【硬核科普】IP 地址是什么东西?IPV6 和 IPV4 有什么区别?公网 IP 和私有 IP 又是什么?| B 站(荐) 1. IP 地址的本质:网络号 + 主机号IP 地址由两部分组成: 部分 作用 举例 网络号 (Network ID) 表示属于哪个子网 192.168.10.0 主机号 (Host ID) 表示子网内的哪台主机 192.168.10.15 规律: 同一子网内:网络号相同,主机号不同。 不同子网:网络号不同,主机号可以重复。 举例: 子网 A:192.168.1.0/24 子网 B:192.168.2.0/24 两个子网的主机号范围都可是 1–254,不冲突,因为网络号不同。 2. IP 地址划分基础1. 划分目的 根本目的就是为了高效管理、节省地址、提升安全和性能。 最初,互联网只分为 A、B、C 类地址(分类地址),但从 1993 年起, ...











