2017-04-20 15 views
1

なぜこの、一見再帰、readKeyの呼び出しが成長して、コールスタックにはなりません把握することはできません:C++非同期ラムダ「再帰」コール

#include <future> 
#include <iostream> 

void readKey() 
{ 
    std::async(std::launch::async, [](){ 
     if (getchar() != 113) // 'q' to quit 
      readKey(); 
    }); 
} 

int main(int, char**) 
{ 
    readKey(); 
    return 0; 
} 

あなたは砦説明ありがとうございました!

+1

どのようにコールスタックサイズを決定していますか? –

+4

スレッドは 'readKey();を何度も呼び出すことはありません。 'std :: async'を呼び出すたびに、新しいスタックを持つ新しいスレッドが作成されます。 –

+0

@FrançoisAndrieux 'async'によって返される' std :: future'は、スレッドが終了するまでデストラクタでブロックされます。 – NathanOliver

答えて

1

:-)

あなたが別のスタックを持つ新しいスレッド(std::launch::async)にそれを呼び出すので、それは再帰呼び出しではありません。だからをmainに呼び出すと、readKeyが呼び出される新しいスレッドが生成され、それを待たずに終了します。

+0

これは、スタックへの呼び出しを追加するのではなく、スレッドと完全なスタックを使用することで、非常に非効率な再帰です。この関数は、技術的に再帰の定義である自身を呼び出します。 –

+0

@RobertJacobs:技術的に言えば、少なくとも直接それを呼び出すのではなく、その呼び出しをスケジュールします。私はあなたが意味するものを確信しています –

+0

@RobertJacobs:このコードのポイントは高効率を達成していませんが、無限ループにおける同じ操作。イベントループのようなもので、擬似再帰ラムダとしてのみ実装されています。 このコードをいくつかのASIOサーバーの例で見ましたが、私の頭をラップすることができませんでした...今、より明確になっています! :) 説明を提供する時間を割いたすべての人に感謝します! – Boris

関連する問題