为什么协程不是魔法

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 线程和计算线程混跑,尾延迟放大
  • 协程对象生命周期管理混乱

实践建议

  1. IO 与 CPU 密集任务分池
  2. 减少跨线程恢复,尽量本地唤醒
  3. 在高频路径避免动态分配

结语

协程把异步写法变自然,但高性能系统仍然遵循老规律:调度、内存、锁竞争。语法升级不能替代架构设计。