std :: async不能异步工作

Mik*_*ola 6 c++ asynchronous c++11

我有以下非常简单的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

因为我使用std::launch::async我希望TestSleep()它将异步运行,我将有以下输出:

TestAsync
TestAsync ok!!!
TestSleep 
TestSleep Ok
Run Code Online (Sandbox Code Playgroud)

但实际上我有同步运行的输出:

TestAsync
TestSleep 
TestSleep Ok
TestAsync ok!!!
Run Code Online (Sandbox Code Playgroud)

你能解释为什么以及如何TestSleep真正地异步拨打电话.

Som*_*ude 7

这个std::async参考注释部分

如果std::future获取的from std::async不是从引用移动或绑定到引用,则std::futurewill 的析构函数将在完整表达式结束时阻塞,直到异步操作完成,从而基本上使代码...同步

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

如果你这样做

auto f = std::async(...);
Run Code Online (Sandbox Code Playgroud)

然后破坏将fTestAsync阻止,并且文本"TestAsync ok!!!"应该打印之前"TestSleep Ok".


And*_*ndy 6

std::async()返回一个实例std::future.如果你查看std::future析构函数的文档,它会说如下:

这些操作不会阻止共享状态准备就绪,除非它可能阻塞以下所有条件都是真的:共享状态是通过调用std :: async创建的,共享状态尚未准备就绪,这个是共享状态的最后一个引用.

您没有将返回值存储std::async()到局部变量中,但仍然创建该值并且必须销毁该值.由于析构函数将阻塞直到函数返回,这使它同步.

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