当前位置: 首页 > news >正文

一周学习总结

 一、阶段总览

天数学习主题技术关键词阶段成果
Day1~Day3Linux 基础与 Shell 脚本g++vimbashMakefile熟悉 Linux 编译环境
Day4~Day6epoll 与 I/O 多路复用socketbindepoll_wait理解事件驱动模型
Day7~Day9智能指针与 RAIIshared_ptrunique_ptrweak_ptr掌握现代C++内存管理
Day10~Day11多线程聊天室服务端epoll + threadpoolatomicLogger实现多线程 ChatServer
附加Git + VS Code 工程化commitbranchpush掌握代码版本控制

 二、Linux 与 Shell 基础(Day1~Day3)

学习目标

  • 掌握 Linux 下的 C++ 编译流程;

  • 能使用脚本自动化编译、备份和运行;

  • 理解多文件项目的组织结构。

编译与自动化

练习使用命令行编译:

g++ main.cpp -o main
./main

进阶脚本:

#!/bin/bash
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="./backup/$DATE"
mkdir -p "$BACKUP_DIR"for file in *.cpp; do[ -f "$file" ] && cp "$file" "$BACKUP_DIR"
doneg++ *.cpp -o main
if [ $? -eq 0 ]; then./main
fi

Makefile 基础

main: main.cpp file.cpp socket.cppg++ -std=c++17 main.cpp file.cpp socket.cpp -o main

学会在项目中解耦模块,实现增量编译。

三、epoll 与事件驱动模型(Day4~Day6)

epoll 原理理解

  • select/poll:遍历所有fd,性能差;

  • epoll:事件驱动机制,只关心“有变化”的fd。

核心调用顺序:

epoll_create → epoll_ctl(注册事件) → epoll_wait(等待事件) → read/write(处理事件)

标准输入监听实验

int epfd = epoll_create(1);
epoll_event ev{.events = EPOLLIN, .data.fd = 0};
epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ev);while(true){epoll_event events[1];int n = epoll_wait(epfd, events, 1, -1);if(n > 0){char buf[128];int len = read(0, buf, sizeof(buf));buf[len] = '\0';cout << "输入内容:" << buf;}
}

事件触发后才读取,理解“非阻塞 + 回调”。

TCP Socket 服务端结构

int fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;bind(fd, (sockaddr*)&addr, sizeof(addr));
listen(fd, 10);

配合 epoll:

  • server_fd 监听新连接;

  • client_fd 监听数据读写。

学会搭建简易 TCP Server,为后面聊天室打基础。

 四、现代 C++ 智能指针与 RAII(Day7~Day9)

 智能指针对比表

类型所有权可拷贝特点使用场景
unique_ptr独占可转移(move)文件、Socket句柄
shared_ptr共享自动引用计数多模块共享资源
weak_ptr弱引用不增加计数防止循环引用

RAII 思想(Resource Acquisition Is Initialization)

“资源的获取与对象生命周期绑定,离开作用域自动释放。”

实验代码:

struct User {string name;User(string n): name(n){ cout << name << " 创建\n"; }~User(){ cout << name << " 销毁\n"; }
};int main(){shared_ptr<User> a = make_shared<User>("Alice");{auto b = a;cout << "引用计数: " << a.use_count() << endl;}cout << "离开作用域,引用计数: " << a.use_count() << endl;
}

 实战:RAII 文件查看器

unique_ptr 封装 Linux 文件操作:

unique_ptr<FileHandler> file = make_unique<FileHandler>("test.txt");
file->ReadAll();

file 作用域结束,自动 close() 文件。

五、多线程聊天室服务器(Day10~Day11)

项目目标

设计一个支持多客户端并发通信的聊天室服务器。

实现功能:

  • 多客户端连接;

  • epoll 事件驱动;

  • 线程池异步广播;

  • RAII 管理连接;

  • 自动日志保存。

项目结构

day11_chatroom_mt/
├── ChatServer.h / .cpp
├── ClientSession.h / .cpp
├── ThreadPool.h / .cpp
├── Logger.h / .cpp
└── main.cpp

关键技术模块

模块主要职责
ChatServerepoll事件循环 + 管理客户端集合
ClientSession封装socket + RAII关闭连接
ThreadPool异步执行任务(广播、日志)
Logger线程安全日志写入
atomic控制安全退出

事件循环核心逻辑

while(running_) {int n = epoll_wait(epfd_, events, 1024, -1);for (int i = 0; i < n; ++i) {int fd = events[i].data.fd;if (fd == listen_fd_) HandleAccept();else HandleMessage(fd);}
}
  • 新连接 → HandleAccept()

  • 客户端消息 → HandleMessage()

  • 异步广播 → ThreadPool::Enqueue()

ThreadPool 线程池

void ThreadPool::Enqueue(std::function<void()> task){{std::lock_guard<std::mutex> lock(mtx_);tasks_.push(std::move(task));}cv_.notify_one();
}void ThreadPool::RunWorker(){while(true){std::function<void()> task;{std::unique_lock<std::mutex> lock(mtx_);cv_.wait(lock, [this]{ return stop_ || !tasks_.empty(); });if (stop_ && tasks_.empty()) return;task = std::move(tasks_.front());tasks_.pop();}task();}
}

 Logger 日志系统

功能实现
单例模式Logger::Get() 全局唯一
分级日志INFO / WARN / ERROR
自动轮转每日新建文件
线程安全mutex保护写操作
命令触发/save 手动刷新

输出示例:

[INFO][2025-11-10 09:31:12] 用户[User4]: hello
[WARN][2025-11-10 09:32:10] 用户[User7]断开连接

六、Git + VS Code 工程化管理

 Git 基础命令

git init
git add .
git commit -m "init chatserver project"
git remote add origin git@github.com:EliasSeele/chatserver.git
git push -u origin main

分支工作流

git checkout -b feature/logger
# 开发中...
git add .
git commit -m "Add Logger module"
git checkout main
git merge feature/logger

完成一个功能 → 创建分支 → 合并 → 推送。

 VS Code 图形化操作

  • 左栏 “Source Control” 面板即可提交;

  • “同步更改”按钮 = git pull && git push;

  • 推荐插件:

    • GitLens:每行代码的作者与提交记录;

    • Git Graph:分支结构一目了然。

七、项目工程化(CMake预告)

下周将进一步模块化项目结构:

ChatServerPro/
├── include/
│   ├── ChatServer.h
│   ├── Logger.h
│   ├── ThreadPool.h
│   └── ClientSession.h
├── src/
│   ├── *.cpp
├── log/
└── CMakeLists.txt

通过:

mkdir build && cd build
cmake ..
make
./chatserver

实现工程化构建。

八、本周知识结构图

Linux编译├─ Shell脚本├─ Makefile└─ g++现代C++├─ 智能指针├─ RAII└─ 异常安全网络编程├─ Socket├─ epoll事件驱动└─ Reactor模型并发编程├─ ThreadPool├─ atomic原子操作└─ condition_variable工程化├─ Git分支管理├─ Logger日志系统└─ 项目模块化
http://www.dtcms.com/a/589626.html

相关文章:

  • 长沙品牌网站设计做网站app要注册哪类商标
  • 【AIGC面试面经第五期】AI绘画-AI绘画框架相关问答
  • 音乐网站设计外国手做网站
  • 网站有什么采集网站后台数据
  • Linux33 网络编程-多线程TCP并发
  • Tomcat和负载均衡
  • 【算力】AI万卡GPU集群交付确认项与日常运维(算力压测、数据倒腾、日常运维)
  • 网站建设 东八区学校网站建设的意义的主要负责人
  • 网站开发招商计划书c 网站开发框架有
  • 成都企业网站开发网站主页设计费用
  • 数据结构——四十、折半查找(王道408)
  • 操作系统 内存(5)虚拟内存机制
  • 郑州网站建设专业乐云seowordpress user role
  • JavaScript 的 Web APIs 入门到实战全总结(day7):从数据处理到交互落地的全链路实战(附实战案例代码)
  • 分类型网站建设付费推广外包
  • 17_FastMCP 2.x 中文文档之FastMCP服务端高级功能:LLM采样详解
  • 集团网站建设制作费用百度公司是国企还是私企
  • Go Channel 深度指南:规范、避坑与开源实践
  • Postman 脚本控制特定请求的执行流程(跳过执行)
  • Kubernetes Deployment 控制器
  • 网络体系结构-物理层
  • 色彩搭配 网站无障碍网站建设方案
  • 网站建设制作公一般做个网站多少做网站多少钱
  • 商业网站建站目的官网建站系统
  • HCCDE-GaussDB相关计算题
  • 从SOMEIP看SOA,汽车电子电器架构的转变
  • 免费自己制作logo的网站wordpress百度百科
  • asp制作网站教程猎头公司网站素材
  • Java--JVM
  • 英语学习——单词篇(第十七天)