协程是用户态轻量控制流,不依赖内核调度,切换开销仅数百纳秒,单线程可承载成千上万个协程;线程由操作系统调度,上下文切换需微秒级且受系统资源限制。

协程是用户态的轻量控制流,线程是操作系统调度的执行单元
协程不依赖内核调度,由编译器和运行时协作管理挂起与恢复,切换开销极小(通常几百纳秒),一个线程可跑成千上万个协程。线程则由操作系统创建和调度,每次上下文切换需陷入内核、保存寄存器、更新调度队列,开销在微秒级,且线程数量受限于系统资源(如栈内存、句柄数)。
协程默认共享同一线程的栈和内存空间,线程有独立栈和受保护的地址空间
协程之间不自动隔离状态,变量生命周期需谨慎设计(比如局部变量在挂起后可能失效,推荐用堆分配或延长作用域)。线程拥有独立的栈和私有TLS(线程局部存储),天然具备内存隔离性,但也带来同步成本——访问共享数据必须加锁、使用原子操作或无锁结构。
协程是协作式并发,线程是抢占式并发
协程只有在明确调用co_await、co_yield或co_return时才会让出控制权,不会被系统中断;这简化了临界区推理,但要求所有异步调用都“配合”——一旦某个协程长时间计算不挂起,就会阻塞整个线程上的其他协程。线程由OS强制调度,即使代码进入长循环,也能被切走,保证公平性,但也引入竞态、死锁等复杂问题。
C++协程本身不解决并发,需配合执行器(executor)或线程池才能并行
标准C++20协程不绑定任何并发模型:它只是定义了promise_type、awaitable等机制,真正调度靠外部执行器。比如用std::jthread启动一个线程跑事件循环,再把多个协程提交给它;或者用第三方库(如libunifex、cppcoro)提供线程池+调度器组合。而线程天生就是并行单位,std::thread直接映射到OS线程,开箱即用但粒度粗。
立即学习“C++免费学习笔记(深入)”;
基本上就这些。协程不是线程的替代品,而是不同抽象层级的工具:协程优化的是I/O密集型任务的吞吐与资源利用率,线程解决的是CPU密集型任务的并行加速。实际项目中常混合使用——比如用少量线程承载高吞吐协程,各司其职。









