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、執行緒池結合?
先理解“協程是可暫停/恢復的控制流”,再去看具體語法會容易很多。