跳到正文

Wiki

協程是什麼

約 2 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

協程(coroutine)關注的是:

一個函式如何暫停,並在之後從暫停的位置繼續執行。

它是一種控制流工具,不等於執行緒,也不天然意味著並行。

1.一個直觀理解

普通函式呼叫通常是:

进入函数
一直执行
返回结果
函数结束

協程更像是:

进入函数
执行一段
暂停
之后恢复
继续执行
再暂停或结束

這種能力非常適合表達非同步流程。

2.協程不是執行緒

執行緒由作業系統排程,多個執行緒可能在多個 CPU 核心上同時執行。

協程通常是協作式的:

协程自己在合适的位置暂停
调度器再恢复其他协程

所以:

多个协程可以在一个线程里交错执行
协程本身不保证并行

如果協程背後配合執行緒池或非同步執行時,才可能和並行執行結合起來。

3.C++ 協程的關鍵詞

C++20 引入了語言級協程支援,常見關鍵詞包括:

  • co_await:等待一個可等待物件,並可能暫停當前協程;
  • co_yield:產生一個值,並暫停當前協程;
  • co_return:從協程返回結果。

不過 C++ 標準庫只提供了協程機制的底層能力,並沒有直接提供完整的高階非同步框架。

因此學習 C++ 協程時,通常還需要結合具體庫或執行時理解。

4.協程適合什麼場景

協程常見於:

  • 非同步 IO;
  • 網路伺服器;
  • 定時任務;
  • 生成器;
  • 狀態機;
  • 需要把回撥式程式碼寫成順序流程的場景。

5.本章後續方向

當前先預留協程概念位置。

後續如果繼續補充,可以從這些問題展開:

  1. co_await 到底等待什麼?
  2. promise type 是什麼?
  3. coroutine handle 是什麼?
  4. generator 和 task 有什麼區別?
  5. 協程怎樣和非同步 IO、執行緒池結合?

先理解“協程是可暫停/恢復的控制流”,再去看具體語法會容易很多。