はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ タスクシステム⑥ ~管理に詰まる~

あいさつ

どうも、はかせです。
今回はコルーチンの管理に詰まって困っている話です。

困っていること

①テンプレート伝搬
私はコルーチンの管理を下図のような感じにしたいと思っています。
f:id:hakase0274:20181224232509p:plain
管理クラスがコルーチンを保持するよくありそうな感じのものです。

ただこれを実現することは意外と難しいです。
というかこのままでは実装さえできるか怪しいです。

現実
f:id:hakase0274:20181224233116p:plain
テンプレートを使うと呼び出し側は
テンプレートの引数リストを渡す義務が発生します。
渡さないとテンプレートの実体化が出来ず
実行どころかコンパイル自体できません。

つまりCoroutine<int>の管理にはCoroutineManager<int>という
専用の管理クラスが必要になってしまうということです。

つまり管理クラス(笑)になっており
管理クラスを通す必要もメリットもないのです。

今のところ考えている解決策

テンプレートをやめる

戻り値を1つに固定することで配列管理を可能にしようという考えです。
C#のコルーチンはIEnumeratorを戻り値として固定しています。
これに倣い戻り値を固定することC#のというかUnityのコルーチンライクに
使うことが出来るのではないかと考えています。

デメリットはUnityのコルーチン同様値の取得がめんどくさくなることです。
コルーチン側とコルーチンを使う側両方に見えるところに共通の変数を置くか
コールバックを使うくらいしかありません。

スレッドを使う

コルーチン+デリゲートの形をやめて丸ごとスレッドにしようという考えです。
C++標準のfuture/promiseを使ってそのまま非同期処理として行うことで
テンプレートの伝搬問題はラムダ式でそのまま渡すことで解決できますし
値の取得も問題なく行えます。

ただ非同期処理というのは伝搬していきます。
最終的に根っこまで伝搬します。
つまりほぼそれ用に作り直す必要があります。

またfuture/promise両方とも存在と簡単な使い方を知っている程度で
動作検証をしたことがないのでそのへん含めてまたかなり時間がかかってしまいます。

また処理を分割して実行したい
(1000個生成を100個ずつ10回でやるとか)
とかがやりにくいです。

あとがき

今現在ではスレッド方式に丸ごと切り替えるのが正かなと思っています。

ただ最後のデメリットが個人的に不満なのでなんとか
コルーチンと合わせるか並列処理も混ぜるとかしてかなきゃなぁといったところですかね。

とりあえずそんなんでスレッド勉強します。
もしそんなことしなくてもこんな感じで出来るよ!
とかあれば教えてくださいm(__)m

それでは今回はこの辺でノシ