为什么协程不是魔法
C++20 协程让异步代码写起来像同步,但它只解决语法组织,不自动提供高性能调度。
真正决定上限的是:
- 任务队列策略
- IO 事件分发
- 唤醒与线程绑定方式
一个简化示意
task<int> fetch_and_parse(socket& s) {
auto buf = co_await async_read(s);
co_return parse(buf);
}
这段很优雅,但背后必须有 executor 驱动 co_await 的挂起与恢复。
调度层常见坑
- 所有任务丢进一个全局队列,热点锁竞争严重
- IO 线程和计算线程混跑,尾延迟放大
- 协程对象生命周期管理混乱
实践建议
- IO 与 CPU 密集任务分池
- 减少跨线程恢复,尽量本地唤醒
- 在高频路径避免动态分配
结语
协程把异步写法变自然,但高性能系统仍然遵循老规律:调度、内存、锁竞争。语法升级不能替代架构设计。