2017-04-20 71 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時,它會產生一個新的線程,其中readKey將被調用,並退出甚至不等待它。

+0

我說這是一個非常低效的遞歸使用一個線程和一個完整的堆棧,而不是僅僅添加一個調用到堆棧。該函數自己調用它,這在技術上是遞歸的定義。 –

+0

@RobertJacobs:從技術上講,它不會自動調用自己,至少是直接調用它,而是調度這個調用,我相信你知道我的意思 –

+0

@RobertJacobs:這個代碼的重點不是實現高效率,而是執行無限循環中的相同操作。有點像事件循環,只能作爲僞遞遞lambda來實現。 我在一些ASIO服務器的例子中看到了這段代碼,無法將它包裹起來......現在,它變得更加清晰了! :) 謝謝所有花時間提供解釋的人! – Boris