2017-08-09 126 views
1

我正在使用VS2013。
我刚刚读了this,发现未来应该在其析构函数中封锁。
为什么std :: future不会阻止

我试了一些代码,但std::future没有阻止。

void PrintFoo() 
{ 
    while (true) 
    { 
     std::cout << "Foo" << std::endl; 
     Sleep(1000); 
    } 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    { 
     auto f = std::async(std::launch::async, PrintFoo); 
    } 
    while (true) 
    { 
     Sleep(1000); 
     std::cout << "Waiting" << std::endl; 
    } 
    std::cout << "Before application end" << std::endl; 
    return 0; 
} 

我有输出:

Foo 
Waiting 
Foo 
Waiting 

我误解的东西吗?

+2

VS2017不会重现此行为。正如预期的那样,它只是不断打印'Foo'。 – AnT

回答

3

是的。围绕f的括号引入了一个新的作用域,并且由于该作用域中定义了f,所以在该作用域结束时它将被销毁。紧接着,f将会阻止。所以在技术上,它应该每秒打印Foo

虽然实际输出更有趣。你的编译器会交织两个无限循环,因为C++ 11(我猜VS2013还不完全兼容C++ 11标准),所以它会产生it isn't allowed to do(因为你的循环有副作用)。

+0

非常感谢。 – sflee

+0

但是那个循环*“调用了库I/O函数”*,所以它不应该假定循环应该终止... – Jarod42

+0

@ Jarod42哦对。也许VS2013并没有实际执行那部分... – Rakete1111

相关问题