协程是语言级轻量控制流机制,用于异步/生成器等场景;线程是OS级并发单元,负责真正并行。二者解决不同问题,需依任务性质协同使用。

协程不是线程,也不是线程的替代品——它们解决的是不同层面的问题。C++20 引入的协程是**语言级的轻量级控制流机制**,用于简化异步、生成器、状态机等场景;而线程是操作系统调度的**并发执行单元**,负责真正意义上的并行。选错模型会导致性能浪费、逻辑混乱或根本无法编译。
协程本质是一个可以多次挂起(suspend)和恢复(resume)的函数。它不绑定 OS 线程,没有栈切换开销,也不需要内核参与调度。一次协程调用可能在同一个线程内分多段执行,中间穿插其他协程或普通代码。
std::coroutine_handle)只保存少量上下文(比如挂起点地址、局部变量地址),内存占用通常几十字节
co_await、co_yield、co_return 显式控制,行为完全可预测generator<int></int>)、状态机建模(如协议解析)线程由操作系统创建和调度,拥有独立栈(默认 1MB+)、寄存器状态、优先级和调度策略。多个线程可在多核上真正并行运行,但也带来同步开销(锁、原子操作)、竞态风险和上下文切换成本(微秒级,但高频时显著)。
co_await 等待线程结束——需配合 std::jthread 或条件变量,否则容易死锁std::jthread 提供自动 join,但仍是重量级资源,不宜高频创建销毁实际项目中,协程与线程往往共存:用少量线程(如 IOCP 线程池或 epoll 循环线程)驱动大量协程。协程负责逻辑拆分,线程负责底层并行执行。
立即学习“C++免费学习笔记(深入)”;
std::this_thread::sleep_for),这会卡住整个线程——应改用协程感知的定时器(如 asio::steady_timer)std::atomic 或 std::mutex)判断依据不是“要不要并发”,而是“是否需要并行执行”以及“控制流是否天然分段”。
generator<t></t> 协程,比手写迭代器简洁得多boost::asio::thread_pool + co_await async_read)基本上就这些。协程不难学,但容易误当成“更轻的线程”来用;线程不难写,但滥用会导致扩展性瓶颈。C++20 协程不是银弹,它是帮你把“该串行的地方串行得更干净,该并行的地方并行得更可控”的工具。
以上就是c++++中的协程(coroutine)与线程的区别_c++并发模型选择【C++20】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号