一周学习总结
一、阶段总览
| 天数 | 学习主题 | 技术关键词 | 阶段成果 |
|---|---|---|---|
| Day1~Day3 | Linux 基础与 Shell 脚本 | g++、vim、bash、Makefile | 熟悉 Linux 编译环境 |
| Day4~Day6 | epoll 与 I/O 多路复用 | socket、bind、epoll_wait | 理解事件驱动模型 |
| Day7~Day9 | 智能指针与 RAII | shared_ptr、unique_ptr、weak_ptr | 掌握现代C++内存管理 |
| Day10~Day11 | 多线程聊天室服务端 | epoll + threadpool、atomic、Logger | 实现多线程 ChatServer |
| 附加 | Git + VS Code 工程化 | commit、branch、push | 掌握代码版本控制 |
二、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
关键技术模块
| 模块 | 主要职责 |
|---|---|
| ChatServer | epoll事件循环 + 管理客户端集合 |
| 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日志系统└─ 项目模块化
