萌えハッカーニュースリーダー

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

出典: https://uvdn7.github.io/cpp-coro/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

それは、デッドロックしそうですね…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search