从零理解 MPSC 无锁写队列:高性能网络框架的发送引擎

写在前面 你有没有想过,一个高并发网络服务器在同时给几千个客户端发消息时,底层到底在忙什么? 最直觉的做法是加把锁——谁要发消息就抢锁、写 socket、放锁。但问题来了:如果 1000 个协程同时要给同一个连接发数据,它们就得排队等这把锁。锁竞争带来的上下文切换、cache 失效,会把性能拖进泥潭。 Hical 框架的解法很酷:用一个 MPSC(多生产者单消费者)无锁队列 做缓冲,配合一个协程写循环做消费。发消息的线程只管往队列里扔节点(wait-free,永远不阻塞),写循环协程在 IO 线程上批量取出、合并发送。 这篇文章会带你从零搞懂这个设计。不需要你有无锁编程的基础,但最好知道 C++ 的 atomic、shared_ptr 和"什么是协程"大概是怎么回事。 一、先搞清楚问题:为什么普通的锁不行? 1.1 一个典型场景 假设你写了个聊天服务器。用户 A 发了条群消息,服务器要转发给群里 200 个在线用户。这意味着: 1 用户A的消息 → 广播逻辑 → 同时调用 200 个连接的 send() 如果 send() 内部用 mutex 保护写操作: 1 2 3 4 5 6 7 8 9 10 11 // 朴素实现(有严重性能问题) void Connection::send(std::string data) { std::lock_guard lock(writeMutex_); // 200个协程在这里排队 writeBuffer_.append(data); if (!writing_) { writing_ = true; doWrite(); // 触发实际的 socket 写入 } } 问题出在哪? ...

May 28, 2026 · 10 min · 2127 words