c++ - 为什么 std::future 不阻塞

标签 c++ c++11

我正在使用 VS2013。
我刚刚读了this并发现 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

我是不是误会了什么?

最佳答案

是的。 f 周围的大括号引入了一个新范围,并且因为 f 是在该范围内定义的,所以当该范围结束时它将被销毁。紧随其后,f 将阻塞。所以从技术上讲,它应该每秒打印一次 Foo

但实际输出更有趣。你的编译器交错了两个无限循环,it isn't allowed to do (因为你的循环有副作用)自 C++11 以来(我猜 VS2013 还没有完全符合 C++11 标准)。

关于c++ - 为什么 std::future 不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580838/

相关文章:

C++:不可变方法版本

c++ - 大类型的 const T& 和简单类型的 T 的特化模板

c++ - 使用 std::forward 的主要目的是什么以及它解决了哪些问题?

c++ - 抛出 'std::bad_alloc' 实例后调用终止

c++ - std::stack 是使用双链表实现的吗?

c++ - 如何获取以字符串和其他用户定义类型作为数字的给定结构的大小(以字节为单位)?

c++ - 辅助库可以用于在不相关的进程(不是 fork 进程)之间共享接受的连接吗?

c++ - 如何防止从 "number to string"函数生成的字符串使用科学记数法?

c++ - 绕过 cin 语句的未初始化局部变量

c++ - 编译错误。正确的代码和输出是什么?