八葉の日記

日々、感じたことをまとめる場として利用する

Futureについてメモ

Future:未来→先物時間がかかる処理を行う際に、とりあえずFutureだけをもらってあとで結果を取得する。
非同期処理の結果を受け取るということを簡単に行うための仕組み
〇例

int foo() { /* 重たい処理 */ }

int main()
{
  // 新たなスレッドで関数foo()を非同期実行
  {
  std::future<int> f = std::async(std::launch::async, foo);
    //fooが別スレッドで実行されている  
    
    /* 何か別の処理 */

    int result = f.get();
    //getで結果が取得できるまでまつ
 }

■疑問
並列に処理を行ってスループットは上げられるけど、結局getで待つの?
これだと重い処理がファイルIOとかで時間の予測も難しいから非同期にしたいというときに使えない。
→処理終了時の振舞いを登録する仕組みがある

■Future then

#include <future>

using namespace std;
    
int main() {
    future<int> f1 = async([]() { return 123; });
    future<string> f2 = f1.then([](future<int> f) {
                                                           return f.get().to_string(); }
                                                        );
}

f1が完了した後の動作をthenに書くことができる。
C++14では上記の書き方はできない。
  将来的には対応するリストにまだある。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3558.pdf

■Futureを使うことのメリット
以下の書籍がとても参考になりました。使い方の説明はWebにたくさんあるのですが、設計として何を意図しているかを説明してくれています。

f:id:konboi_kun:20190331213638j:plainf:id:konboi_kun:20190331213730j:plain

マルチスレッドを意識しているのは誰?
Host:スレッド起動しているから
FutureData:Dataのget/setで競合を防ぐ必要があるから

実際にDataを作成する一番ロジックが入るRealDataに非同期を意識しなくてよくなる。
これって、Humble Object :https://msdn.microsoft.com/ja-jp/magazine/dn818494.aspxにつながるのだろうか。

■オマケ
Qtを使って時間のかかる非同期処理をさせながら、UIを止めずに操作できるか試している
GitHub - DaisukeSawada/Future_Training