2017-08-09 148 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

相關問題