我有以下非常简单的代码:
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吗?
发布于 2017-06-20 13:38:50
来自 reference notes section
如果从
std::future获得的std::async未从引用中移动或绑定到引用,则std::future的析构函数将在完整表达式的末尾阻塞,直到异步操作完成,实质上是编写代码.同步
这就是这里发生的事。由于您没有存储std::async返回的未来,所以它将在表达式的末尾(即std::async调用)进行析构,并将被阻塞,直到线程结束。
如果你这样做的话。
auto f = std::async(...);然后,f在TestAsync末尾的销毁将被阻塞,文本"TestAsync ok!!!"应该打印在"TestSleep Ok"之前。
发布于 2017-06-20 13:38:07
std::async()返回std::future的一个实例。如果您查看's destructor的文档,它说明如下:
这些操作不会阻止共享状态的就绪,但如果以下所有内容都为真,则可能会阻塞:共享状态是通过调用std::异步创建的,共享状态尚未准备好,这是对共享状态的最后一次引用。
您没有将std::async()的返回值存储到局部变量中,但该值仍然是创建的,必须销毁。因为析构函数将被阻塞,直到函数返回为止,这使得它是同步的。
如果您将TestAsync()更改为返回std::async()创建的std::future(),那么它应该是异步的。
https://stackoverflow.com/questions/44654548
复制相似问题