boost.coroutine2已弃用,应改用C++20协程及cppcoro或libunifex;仅老项目维护可锁定Boost 1.69.0并规避栈/链接问题。

boost.coroutine2 已被标记为 deprecated,别再新项目里用了
Boost 1.70 开始,boost.coroutine2 就被官方标为 deprecated;1.75 起彻底移出主分支,只保留在 boost-experimental 仓库里。它不支持 C++20 协程语法,也没人维护了。你现在看到的文档、博客示例,大概率跑不通或编译失败。
如果你只是想写个状态机、分段执行逻辑,或者临时替换回调嵌套,boost.coroutine2 看似简单,实则埋雷:
- 依赖 Boost.Context,而后者在 macOS ARM64 / Windows Clang 下链接失败很常见
- 协程栈大小默认 64KB,超了就静默崩溃,没提示
-
pull_coroutine<T>和push_coroutine<T>的调用顺序稍错一点,std::terminate直接招呼
替代方案:C++20 std::coroutine + libunifex 或 cppcoro
真要协程,直接上标准库底座。C++20 提供了 co_await、co_yield、co_return 和三类核心组件:promise_type、coroutine_handle、coroutine_traits。但裸写太重,推荐轻量封装库:
-
cppcoro:头文件库,无依赖,task<T>、async_mutex、when_all都有,适合中小项目 -
libunifex(Facebook 开源):更现代,支持 executor 模型,但需要 C++20 完整支持(GCC 12+/Clang 14+) - 别碰
boost::asio::awaitable做通用协程——它绑死 asio 的 io_context,纯计算场景反而拖慢
比如用 cppcoro 写一个带取消的延迟任务:
立即学习“C++免费学习笔记(深入)”;
cppcoro::task<int> fetch_with_timeout() {
auto op = co_await cppcoro::with_timeout(
std::chrono::seconds(3),
http_get_async("https://api.example.com/data")
);
if (op.has_value()) co_return op.value();
co_return -1;
}
如果非得跑通 boost.coroutine2,这些坑必须绕开
仅限维护老代码、或教学演示。以下配置能避开 90% 编译/运行时问题:
- Boost 版本锁定在
1.69.0(最后稳定版),别用 1.70+;从 官网归档页 下载 - CMake 中显式链接
boost_context和boost_thread:target_link_libraries(myapp PRIVATE boost_context boost_thread) - 所有
pull_coroutine<int>对象必须在栈上创建,不能new或放进std::shared_ptr——析构顺序错会导致栈未释放就跳转 - 避免跨协程捕获局部变量引用;传参一律用值或
std::shared_ptr
典型崩溃错误:coroutine: illegal instruction (core dumped),基本是上下文切换时栈被回收或对齐异常,不是代码逻辑错。
协程不是银弹,先问自己要不要
很多号称“用协程简化异步”的场景,其实用 std::future + std::thread 更直白,调试也方便。协程真正省事的地方只有两个:
- 需要在单线程里维持大量并发状态(比如万级连接的网络服务)
- 业务逻辑天然分段,且每段耗时不固定(如游戏 AI 行为树、解析器递归下降)
否则,加一层协程调度器,反而让 stack trace 变成黑盒,gdb 跳不到你写的 co_await 行,只停在 __builtin_unwind_init 里。











