SlideShare a Scribd company logo
1
20分くらいで
わかった気分になれる†
C++20コルーチン
2019/9/4
C++MIX #5
†効果には個人差があります。C++20コルーチン 完全理解™️を保証するものではありません。
2
はじめに
誰?
twitter @yohhoy / hatena id:yohhoy
何を?
C++20導入予定の コルーチン 概要を紹介
どうして?
勉強会駆動 C++20コルーチン調査
 本日のディスカッション ネタ提供
Coroutines
3
Question: コルーチン?
並行タスク(Concurrency task)
非同期I/O(Asynchronous I/O)
ジェネレータ(Generator)
エラー伝搬(Error propagation)
4
並行タスク(Concurrency task)
非同期I/O(Asynchronous I/O)
ジェネレータ(Generator)
エラー伝搬(Error propagation)
Answer: C++20コルーチン
5
Answer: C++20コルーチン
並行タスク(Concurrency task)
非同期I/O(Asynchronous I/O)
ジェネレータ(Generator)
エラー伝搬(Error propagation)
ハイレベル機能の
実装に利用する
低レベル言語仕様 と
新しい構文 を定義
6
C++20コルーチンのユーザは誰?
並行タスク
ライブラリ
ジェネレータ,
etc.
非同期I/O
ライブラリ
アプリケーション
プログラマ
ライブラリ
プログラマ
co_await
co_yield
co_return
co_await
co_yield
co_return
コルーチン
言語仕様
コルーチン
言語仕様
7
C++23, C++26, or someday
並行タスク
ライブラリ
ジェネレータ,
etc.
非同期I/O
ライブラリ
アプリケーション
プログラマ
Parallel Algorithm
Ranges Library
std::expected
Executors TS
Networking TS
8
C++20コルーチン
新キーワード
  co_await
  co_yield
  co_return
標準ヘッダ<coroutine>
  coroutine_traits<R,Args...>
  coroutine_handle<Promise>
  suspend_never
  suspend_always
  noop_coroutine()
カスタマイズポイント
 Promise type
 Awaitable type
 operator co_await
9
C++20コルーチン
10
C++20コルーチン
11
If you are
12
関数とコルーチン
C++コルーチンは関数を拡張したもの
関数(function)
 呼出(call)により処理開始/呼出元へ復帰(return)
コルーチン(coroutine)
 呼出(call)により処理開始/呼出元へ復帰(return)
 途中での中断(suspend)と再開(resume)をサポート
13
関数(サブルーチン)
コルーチン
関数とコルーチン
call return
call return
suspend suspend
resume resume
caller
function
caller
coroutine
14
コルーチンを途中破棄
別スレッドから再開
関数とコルーチン
caller
coroutine
destroy
caller
thread#1
coroutine
caller
thread#2
coroutine_handle移動
15
関数とコルーチン
本体部にコルーチン構文が登場したらコルーチン
関数シグネチャからは区別しない/できない
future<int> c1() {
co_yield 42;
}
future<int> f1() {
return make_future(42);
}
task<void> c2() {
co_await read();
co_await write();
}
task<void> f2() {
return []{
read(); write(); };
}
※上記コード片は説明用のイメージです。
coroutine function
16
Asymmetric vs. Symmetric
非対称(Asymmetric)/対称(Symmetric)コルーチンの
両方をサポートする
非対称コルーチン
 現コルーチンを中断=再開元(resumer)に戻る
 大抵のケースでは非対称コルーチンが使われる
対称コルーチン
 任意のコルーチンへと制御を移す(control transfer)
 相手コルーチンを”知っている”ケースでのみ利用
17
Asymmetric
Symmetric
Asymmetric vs. Symmetric
coroutine#1
coroutine#3
coroutine#2
coroutine#1
coroutine#3
coroutine#2
Bookkeeping code
18
Stackless vs. Stackful
C++コルーチンはスタックレス(Stackless)
 コルーチンでのみ co_await/co_yield を利用可能
 ���ストしたラムダ式や呼出先の関数では利用不可
 中断/再開用のコールスタック保持不要のため軽量
【参考:スタックフル(Stackful)コルーチン】
任意のタイミングでコルーチン中断/再開が可能
Go言語のgoroutineや協調的ファイバ(Fiber)など
中断/再開用のコールスタックを保持するため高コスト
19
Stackless vs. Stackful
void f() {
// suspend
}
task<void> g()
// suspend
f();
}
コルーチン g
フレーム
void f() {
// suspend
}
task<void> g()
// suspend
f();
}
関数 f
フレーム
コルーチン g
フレーム
Stackless
(C++コルーチン)
Stackful
20
C++20コルーチン (再掲)
新キーワード
  co_await
  co_yield
  co_return
標準ヘッダ<coroutine>
  coroutine_traits<R,Args...>
  coroutine_handle<Promise>
  suspend_never
  suspend_always
  noop_coroutine()
カスタマイズポイント
 Promise type
 Awaitable type
 operator co_await
21
C++コルーチンの実例
〜 アプリケーションプログラマ視点 〜
generator iota(int end)
{
for (int n = 0; n < end; ++n)
co_yield n;
}
int main()
{
auto g = iota(10);
for (auto e : g)
std::cout << e << " ";
}
$ clang++ src.cpp -std=c++2a
$ ./a.out
0 1 2 3 4 5 6 7 8 9
22
C++コルーチンの実例
〜 ライブラリプログラマ視点 〜
https://wandbox.org/permlink/IpSC8my6j0A1gT0I
struct generator {
struct promise_type {
int value_;
auto get_return_object()
{ return generator{*this}; }
auto initial_suspend()
{ return std::suspend_always{}; }
auto final_suspend()
{ return std::suspend_always{}; }
auto yield_value(int v)
{
value_ = v;
return std::suspend_always{};
}
void return_void() {}
void unhandled_exception()
{ throw; }
};
using coro_handle =
std::coroutine_handle<promise_type>;
struct iterator {
coro_handle coro_;
bool done_;
iterator& operator++()
{
coro_.resume();
done_ = coro_.done();
return *this;
}
bool operator!=(const iterator& rhs) const
{ return done_ != rhs.done_; }
int operator*() const
{ return coro_.promise().value_; }
};
// (cont.)
// (cont.)
~generator()
{
if (coro_)
coro_.destroy();
}
generator(generator const&) = delete;
generator(generator&& rhs)
: coro_{std::exchange(rhs.coro_, nullptr)}
{}
iterator begin()
{
coro_.resume();
return {coro_, coro_.done()};
}
iterator end()
{ return {{}, true}; }
private:
explicit generator(promise_type& p)
: coro_{coro_handle::from_promise(p)}
{}
coro_handle coro_;
};
23
C++コルーチン At-a-Glance
generator iota(int end) {
for(int n=0; n<end; ++n)
co_yield n;
}
coroutine_handle
引数, ローカル変数
再開位置情報
Promise object
Promise type
Return object
Return type
取得
コルーチン開始時に
オブジェクト生成
Coroutine state
中断時の
動作記述
Awaiter object
Awaitable type
コルーチン
中断処理
コルーチン開始時に
動的メモリ確保
型を導出
コルーチン
再開要求
24
コルーチンハンドル
std::coroutine_handle<Promise>
コルーチン再開用のハンドル型
 Promise object経由でハンドルを取得する
 コルーチンの実行に対してハンドルが1:1対応
co_await式
co_yield式
コルーチン コルーチン
ハンドル
中断(suspend)
再開(resume)
取得
from_promise
呼出(call)
25
Promise
コルーチン動作仕様を記述するユーザ定義クラス
 Promise typeはコルーチン戻り値型から導出
 Promise objectはコルーチン実行と1:1対応
 動作のカスタマイズポイントを規定
(constructor)
get_return_object
yield_value
await_transform
unhandled_exception
operator new/delete
get_return_object_on_allocation_failure
initial_suspend
final_suspend
return_value
return_void
26
Awaitable
中断/再開の動作���様を記述するユーザ定義クラス
 コルーチン本体のco_await/co_yield動作を制御
 コルーチン開始直後/終了直前の動作を制御
 動作のカスタマイズポイントを規定
await_ready
await_suspend
await_resume Trivial Awaitable
std::always_suspend
std::never_suspend
<coroutine>提供クラス
27
その他
std::coroutine_traitsトレイツ特殊化
コルーチン引数とPromise typeコンストラクタ
co_yield式とyield_value
co_return式とreturn_value/return_void
co_await演算子オーバーロード
unhandled_exceptionと例外処理
型消去(Type Erasure)されたstd::coroutine_handle<>
std::coroutine_handleとvoidポインタ相互運用
ヒープメモリ確保省略最適化(“Halo”)
...
28
C++20コルーチン対応状況
コンパイラサポート状況
 Clang, MSVC :部分的にサポート
 GCC, etc. :未対応
対応ライブラリ
 CppCoro - A coroutine library for C++
  https://github.com/lewissbaker/cppcoro
 Boost.ASIO [Experimental]
  https://github.com/boostorg/asio
 Facebook Folly [Experimental]
  https://github.com/facebook/folly
29
まとめ
C++20コルーチンは
 処理の中断/再開をサポートする関数 
 軽量なスタックレスコルーチン
 ライブラリ実装用の低レベル部品のみ提供
 多数のカスタマイズポイントを規定
C++20以後のコルーチン・ライブラリ発展に期待
君だけの
最強ライブラリを
作れるぞ!
30
[おまけ] More information
Working Draft, Standard for Programming Language C++
 http://eel.is/c++draft/
Halo: coroutine Heap Allocation eLision Optimization
 https://wg21.link/p0981r0
Impact of coroutines on current and upcoming library facilities
 https://wg21.link/p0975r0
Coroutine Theory
 https://lewissbaker.github.io/2017/09/25/coroutine-theory
How C++ coroutines work
 https://kirit.com/How%20C%2B%2B%20coroutines%20work
luncliff/coroutine
 https://luncliff.github.io/coroutine/Home/
C++コルーチン拡張メモ
 https://qiita.com/yohhoy/items/aeb3c01d02d0f640c067
31
[おまけ] Stackless vs. Stackful
Stackful Coroutines(Fiber)
 fiber_context - fibers without scheduler [Oliver K., Nat G.]
  https://wg21.link/p0876r8
Fibers under the magnifying glass [Gor N.]
 https://wg21.link/p1364r0
Response to “Fibers under the magnifying glass” [Nat G., Oliver K.]
 https://wg21.link/p0866r0
Response to response to “Fibers under the magnifying glass” [Gor N.]
 https://wg21.link/p1520r0
Gorさん = C++20に統合されたCoroutines TS提案者
Oliverさん = Boost.Coroutine, Coroutine2, Fiber, Contextライブラリ作者

More Related Content

PDF
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
 
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
PDF
こわくない Git
Kota Saito
 
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
PDF
Constexpr 中3女子テクニック
Genya Murakami
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
不遇の標準ライブラリ - valarray
Ryosuke839
 
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
こわくない Git
Kota Saito
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
Constexpr 中3女子テクニック
Genya Murakami
 
例外設計における大罪
Takuto Wada
 
不遇の標準ライブラリ - valarray
Ryosuke839
 

What's hot (20)

PDF
目grep入門 +解説
murachue
 
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
PDF
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PDF
中3女子でもわかる constexpr
Genya Murakami
 
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
PDF
プログラムを高速化する話
京大 マイコンクラブ
 
PDF
Java8でRDBMS作ったよ
なおき きしだ
 
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
 
PPT
メタプログラミングって何だろう
Kota Mizushima
 
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
 
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
 
PDF
すごい constexpr たのしくレイトレ!
Genya Murakami
 
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
PPTX
イベント・ソーシングを知る
Shuhei Fujita
 
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
Quine・難解プログラミングについて
mametter
 
PPTX
Docker Tokyo
cyberblack28 Ichikawa
 
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
目grep入門 +解説
murachue
 
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
中3女子でもわかる constexpr
Genya Murakami
 
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
プログラムを高速化する話
京大 マイコンクラブ
 
Java8でRDBMS作ったよ
なおき きしだ
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
 
メタプログラミングって何だろう
Kota Mizushima
 
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
 
オブジェクト指向できていますか?
Moriharu Ohzu
 
すごい constexpr たのしくレイトレ!
Genya Murakami
 
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
イベント・ソーシングを知る
Shuhei Fujita
 
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
Quine・難解プログラミングについて
mametter
 
Docker Tokyo
cyberblack28 Ichikawa
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
Ad

Similar to 20分くらいでわかった気分になれるC++20コルーチン (15)

PDF
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
PDF
Async design with Unity3D
Kouji Hosoda
 
PDF
コルーチンの使い方
Naohiro Yoshikawa
 
PDF
Boost.Coroutine
melpon
 
PDF
Improvement future api
Akira Takahashi
 
PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門
sandai
 
PDF
規格書で読むC++11のスレッド
Kohsuke Yuasa
 
PPT
JVM-Reading-ParalleGC
Minoru Nakamura
 
PPT
Jvm reading-parallel gc
Minoru Nakamura
 
PDF
Pfi Seminar 2010 1 7
Preferred Networks
 
PDF
小二病でもGCやりたい
dec9ue
 
PDF
Continuation with Boost.Context
Akira Takahashi
 
PDF
コルーチンを使おう
amusementcreators
 
PDF
並行プログラミングと継続モナド
Kousuke Ruichi
 
PDF
Boost Tour 1_58_0 merge
Akira Takahashi
 
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
Async design with Unity3D
Kouji Hosoda
 
コルーチンの使い方
Naohiro Yoshikawa
 
Boost.Coroutine
melpon
 
Improvement future api
Akira Takahashi
 
【学習メモ#11th】12ステップで作る組込みOS自作入門
sandai
 
規格書で読むC++11のスレッド
Kohsuke Yuasa
 
JVM-Reading-ParalleGC
Minoru Nakamura
 
Jvm reading-parallel gc
Minoru Nakamura
 
Pfi Seminar 2010 1 7
Preferred Networks
 
小二病でもGCやりたい
dec9ue
 
Continuation with Boost.Context
Akira Takahashi
 
コルーチンを使おう
amusementcreators
 
並行プログラミングと継続モナド
Kousuke Ruichi
 
Boost Tour 1_58_0 merge
Akira Takahashi
 
Ad

Recently uploaded (9)

PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 

20分くらいでわかった気分になれるC++20コルーチン