跳到正文

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、線程池結合?

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