2017-06-20 134 views
3

我有下面的代码非常简单:的std ::异步不起作用异步

void TestSleep() 
{ 
    std::cout << "TestSleep " << std::endl; 
    sleep(10); 
    std::cout << "TestSleep Ok" << std::endl; 

} 

void TestAsync() 
{ 
    std::cout << "TestAsync" << std::endl; 
    std::async(std::launch::async, TestSleep); 
    std::cout << "TestAsync ok!!!" << std::endl; 

} 

int main() 
{ 
    TestAsync(); 
    return 0; 
} 

由于我使用std::launch::async我希望TestSleep()将异步运行,我将有以下的输出:

TestAsync 
TestAsync ok!!! 
TestSleep 
TestSleep Ok 

不过说真的我有同步运行的输出:

TestAsync 
TestSleep 
TestSleep Ok 
TestAsync ok!!! 

您能否解释为什么以及如何使TestSleep调用真的异步。

回答

4

std::async()返回std::future的实例。如果你看一下std::future's destructor的文档,它说以下内容:

这些行动不会为共享状态块准备就绪,但如果以下所有条件都为真可能会阻止:共享状态是通过调用std :: async创建,共享状态尚未准备好,并且这是对共享状态的最后一个引用。

你是不是存储std::async()返回值到一个局部变量,但仍创造了价值,必须予以销毁。由于析构函数会阻塞,直到你的函数返回,这使它同步。

如果更改TestAsync()返回由std::async()创建的std::future(),那么它应该是异步的。

2

this std::async reference notes section

如果从std::async获得的std::future不从移动或结合到参考,std::future的析构函数将在充分表达的端部阻塞,直到异步操作完成,基本上使代码...同步

这是在这里发生的事情。由于您不存储std::async返回的将来,它将在表达式的末尾被破坏(这是std::async调用),并且将阻塞,直到线程完成。

如果你这样做,

auto f = std::async(...); 

然后fTestAsync末端的破坏将块和文本"TestAsync ok!!!""TestSleep Ok"前被打印。