2017-04-20 115 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