9.7k9 分钟

# 定义别名 using 和 typedef 一样,并不会创建新的类型,他们只是给某些类型定义了 新的别名 ,using 相教于 typedef 的优势在于定义函数 更加直观 ,并且可以给模版 定义别名 而 typedef 无法 定义模版 typedef 旧的类型名 新的类型名;typedef unsigned int uint_t;// 使用 using 定义using 新的类型 = 旧的类型;using uint_t = int;// 定义函数指针对比typedef int(*func)(int,double);usi
15k13 分钟

# 红黑树 Red-black tree 自平衡二叉查找树,可在 O(log n) 时间内完成查找,插入和删除。 强查找. Linux 进程调度 CFS epoll 事件块的 管理 Nginx Timer 事件管理 # 性质 每个节点是 红色 的或者 黑的 根 节点是 黑的 每个 叶子 节点是 黑的 如果一个节点是 红的 ,则它的 两个儿子 都是 黑 的 对每个节点,从该节点到其 子孙节点 的所有路径上包含 相同的黑节点 (最低和最高的差最长为 2*n -1 , 最多旋转树高) # 用途 key value 顺序执行 # 红黑树定义 // 解决
20k18 分钟

# Http 高并发服务器 (Reactor 模型) 01 simple # 开发环境 # 系统 Visual studio 2022 + WSL 子系统,详细查看 微软教程 [1] 解决方案文件下->文件名->属性 常规 -> 远程根目录 (可设置项目上传的目录) C/C++ -> 语言 -> C语言标准 -> 选择 C11 (GNU Dialect) (-std=gnu11) 链接器 -> 输入 -> 库依赖项 输入 pthread //在linux安装相关库sudo
25k23 分钟

# I/O 多路复用 (转接) 处理并发, 多进程 / 多线程并发, accept 检测 客户端连接 请求和子线程和建立连接的客户端 通信 ,都会 发送阻塞 ,有新客户端 连接 / 有 数据 到达才会 解除阻塞 。 IO 多路转接并发 委托 内核 帮助 检测文件描述符 的 状态 ( 通信 和 监听 两类), 在通信过程中监听 (连接请求信息) 和通信 (读和写) 都会放到 读写缓冲区 中,当 调用accept 就会检测 监听中 是否有连接请求,如果没有则会 一直阻塞 。通信的读写缓冲区也是阻塞的。当只有 一个线程 时, 监听和两个通信 都会处于阻塞状
14k13 分钟

# Qt 多线程文件传输项目 # 通信流程 # 项目文件 pro 文件添加 network模块 # 服务端 # mainwindow.h #ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "mytcpsever.h"namespace Ui &#123;class MainWindow;&#125;class MainWindow : public QMainWindow&#123; Q_OBJECTpublic: expli
16k14 分钟

# TCP 通信 Qt 需要 network 模块实现套接字通信,在 pro 文件中提前加入。所有通信函数与 C++ 封装 TCP 通信类似。 # 通信与函数 # TCP 通信案例 # 服务端 # UI # server.h #ifndef SERVER_H#define SERVER_H#include <QMainWindow>#include <QTcpSocket>#include <QTcpServer>namespace Ui &#123;class server;&#125;class server : publi
9.1k8 分钟

# 信号 信号 本质是一个 整数 ,不同的信号对应不同 的值 ,由于信号的结构简单,不能携带大量信息量,在系统中的 优先级非常高 # 信号编号 SIGHUP : 用户 退出shell 时,由 shell 启动的 所有进程都收到此信号 SIGINT : 用户按 下Ctrl + C 组合键,用户终端向所有 正在运行 的由该终端启动的程序发出 此信号 // 查看man文档的信号描述man 7 signal# 信号状态 产生 :输入,函数 调用 ,执行设立了 指令 未决 :信号残生,但此信号还没有被 处理掉 抵达: 信号 被处理了 # 信号函数 #inlcu
10k9 分钟

# UDP 通信 UDP 是一个面向 无连接 的 (不需要 connect 操作),不安全的,报式传输层协议, UDP 的通信过程也是 默认阻塞 的 UDP 首部没有关于数据顺序的信息,若数据丢失,就 全部丢失 ,不存在一半的情况,发送端不知道数据是否非正确接受,也不会重发数据。 在 UDP通信 过程中,哪一段是接受数据的角色,那么这个接收端就 必须绑定 一个固定的 端口 # UDP 发送端 #include <stdio.h>#include <string.h>#include <sys/types.h>#include <
17k15 分钟

# 套接字通信 设计者开发的 接口 ,以便应用程序调用该通信接口进行 通信 # 字节序 字节的顺机序,大于一个字节类型的数据在内存中的存放顺序。 Little-Endian 小端模式:数据的 低 位字节存在 低位 ,PC 机默认低位 Big-Endian :大端模式 (网络字节序) 数据的 低位 字节存储到 高地 址位,套接字 通信 中操作的数据都是 大端存储 ,包括: 接受/发送数据,IP地址,端口 # 字节转换函数 #include <arpa/inet.h>// 将一个短整型 short 从主机字节序 -> 网络
13k12 分钟

# Linux 多线程 线程时轻量级的进程 ( LWP: light weight process ),在 linux 环境下线程的本质仍是 进程 ,进程时资源分配的 最小单位 ,线程时操作系统调度执行的 最小单位 上下文切换:进程 / 线程 分时复用CPU时间片 ,在切换之前会将上一个任务的状态进行保存,下次切换回这个任务的时候,加载这个状态继续运行,任务从保存到再次加载这个进程就是一次 上下文切换 ,线程更加廉价,启动速度更快,退出也快,对系统资源 冲击小 。线程并不是越多越好, 文件 IO 操作 : 线程的个数 = 2* CPU核心数 (效率最高) 处理 复杂