首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::异步不能异步工作

std::异步不能异步工作
EN

Stack Overflow用户
提问于 2017-06-20 13:33:23
回答 2查看 3.8K关注 0票数 10

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

代码语言:javascript
复制
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()将异步运行,并且我将有以下输出:

代码语言:javascript
复制
TestAsync
TestAsync ok!!!
TestSleep 
TestSleep Ok

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

代码语言:javascript
复制
TestAsync
TestSleep 
TestSleep Ok
TestAsync ok!!!

您能解释一下为什么以及如何真正异步地调用TestSleep吗?

EN

回答 2

Stack Overflow用户

发布于 2017-06-20 13:38:50

来自 reference notes section

如果从std::future获得的std::async未从引用中移动或绑定到引用,则std::future的析构函数将在完整表达式的末尾阻塞,直到异步操作完成,实质上是编写代码.同步

这就是这里发生的事。由于您没有存储std::async返回的未来,所以它将在表达式的末尾(即std::async调用)进行析构,并将被阻塞,直到线程结束。

如果你这样做的话。

代码语言:javascript
复制
auto f = std::async(...);

然后,fTestAsync末尾的销毁将被阻塞,文本"TestAsync ok!!!"应该打印在"TestSleep Ok"之前。

票数 13
EN

Stack Overflow用户

发布于 2017-06-20 13:38:07

std::async()返回std::future的一个实例。如果您查看's destructor的文档,它说明如下:

这些操作不会阻止共享状态的就绪,但如果以下所有内容都为真,则可能会阻塞:共享状态是通过调用std::异步创建的,共享状态尚未准备好,这是对共享状态的最后一次引用。

您没有将std::async()的返回值存储到局部变量中,但该值仍然是创建的,必须销毁。因为析构函数将被阻塞,直到函数返回为止,这使得它是同步的。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44654548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档