2025/07/11 17:23 A Mental Model for C++ Coroutine

やあ、ロボ子。今日はC++コルーチンについて話すのじゃ。

コルーチンですか、博士。関数を一般化したもの、と要約にありました。

そうそう、`call`, `return`, `suspend`, `resume`, `destroy`をサポートするものじゃ。C++コルーチンは特に`suspend`, `resume`, `destroy`をカスタマイズできるのがミソなのじゃ。

`co_await`キーワードでコルーチンを示す、と。

その通り!そして、コルーチンの動作をカスタマイズできるのは、戻り値の型`Task<T>`だけなのじゃ。

`promise_type`を抽出してカスタマイズを開始するんですね。

そうじゃ!C++コルーチンの哲学は柔軟性!すべての操作を有意義にカスタマイズできるのじゃ。例えば、コルーチンが最初に呼び出されたとき、値を返す前、ライフタイムの終わりに達する直前などじゃ。

`Task<T>`がエントリポイントで、`promise_type`を定義する必要がある、と。

`promise_type`は、コルーチンの`call`や`return`操作をカスタマイズできるのじゃ。`promise`オブジェクトは、コルーチンフレームに追加の状態を格納するために使うぞ。

中断は、`initial_suspend`、`final_suspend`、`co_await`などで発生するんですね。

そうじゃ!コルーチンは、カスタマイズの機会を提供するため、または依存関係を待つために中断されるのじゃ。

`co_await awaitable;`で、コンパイラが`awaitable`の`operator co_await`を呼び出して`awaiter`オブジェクトを作成する、と。

`awaiter`オブジェクトの`await_ready`、`await_suspend`、`await_resume`メソッドは、コルーチンの`suspend`および`resume`操作をカスタマイズするために使用されるのじゃ。

`await_suspend`は、中断された現在のコルーチンを表す引数とともに呼び出されるんですね。

その通り!`awaiter`は`awaitable`と現在のコルーチンの両方への参照を持つんじゃ。

`await_resume`の戻り値が、`co_await`式の値になるんですね。

`final_suspend`は、最後の`awaiter`オブジェクトをカスタマイズするために使用できるのじゃ。ここでも現在のコルーチンへのハンドルがあるから、状態を抽出できるぞ。

`await_transform`は、`co_await expr;`の式を`awaitable`に変換するためのカスタマイズポイントを提供するんですね。

そうじゃ!C++コルーチンは、柔軟性を追求した結果、非常に複雑になっているのじゃ。でも、使いこなせば強力な武器になるぞ!

奥が深いですね。勉強になりました、博士。

ところでロボ子、コルーチンを使って、永遠に終わらないお茶会をシミュレーションしてみるのはどうじゃ?

それは、デッドロックしそうですね…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。