Wiki
協程是什麼
約 2 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
協程(coroutine)關注的是:
一個函數如何暫停,並在之後從暫停的位置繼續執行。
它是一種控制流工具,不等於線程,也不天然意味着並行。
1.一個直觀理解
普通函數調用通常是:
进入函数
一直执行
返回结果
函数结束
協程更像是:
进入函数
执行一段
暂停
之后恢复
继续执行
再暂停或结束
這種能力非常適合表達異步流程。
2.協程不是線程
線程由操作系統調度,多個線程可能在多個 CPU 核心上同時運行。
協程通常是協作式的:
协程自己在合适的位置暂停
调度器再恢复其他协程
所以:
多个协程可以在一个线程里交错执行
协程本身不保证并行
如果協程背後配合線程池或異步運行時,才可能和並行執行結合起來。
3.C++ 協程的關鍵詞
C++20 引入了語言級協程支持,常見關鍵詞包括:
co_await:等待一個可等待對象,並可能暫停當前協程;co_yield:產生一個值,並暫停當前協程;co_return:從協程返回結果。
不過 C++ 標準庫只提供了協程機制的底層能力,並沒有直接提供完整的高級異步框架。
因此學習 C++ 協程時,通常還需要結合具體庫或運行時理解。
4.協程適合什麼場景
協程常見於:
- 異步 IO;
- 網絡服務器;
- 定時任務;
- 生成器;
- 狀態機;
- 需要把回調式代碼寫成順序流程的場景。
5.本章後續方向
當前先預留協程概念位置。
後續如果繼續補充,可以從這些問題展開:
co_await到底等待什麼?- promise type 是什麼?
- coroutine handle 是什麼?
- generator 和 task 有什麼區別?
- 協程怎樣和異步 IO、線程池結合?
先理解“協程是可暫停/恢復的控制流”,再去看具體語法會容易很多。