std :: async和std :: future行为

时间:2016-05-22 00:06:59

标签: c++ c++11

我正在尝试理解异步行为,并编写了一些愚蠢的测试程序。

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/

使用上面的代码,输出似乎完全同步。所有10000个线程似乎按顺序执行。主线程块。

int f(int i)
    {
        std::cout << i << ": hello" << std::endl;
        int j = 0;
        while (j < 10000) //just add some delay
        {
            j++;
        }
        return j;
    }

int main()
{
    for (int i = 0; i < 10000; i++)
    {
        std::async(std::launch::async, f, i);
    }
    std::cout << "in main" << std::endl;
}

但是,当返回的未来存储在向量中时,输出将全部损坏并且主要退出而不等待生成的线程。线程是否在此处分离?

0: hello
1: hello
2: hello
.......
10000: hello
in main

输出:

int main()
{
    std::vector<std::future<int>> v;

    for (int i = 0; i < 10000; i++)
    {
        v.push_back(std::move(std::async(std::launch::async, f, i)));
    }

    std::cout << "in main" << std::endl;
}

最后,尝试在返回的未来使用get()仍会产生类似的错位输出:

2: hello3: hello

46: hello
: hello5: hello
9: hello
10: hello
11: hello

输出:

int main()
{
    std::vector<std::future<int>> v;

    for (int i = 0; i < 10000; i++)
    {
        v.push_back(std::move(std::async(std::launch::async, f, i)));
    }

    for (int i = 0; i < 10000; i++)
    {
        std::cout << v[i].get();    
    }

    std::cout << "in main" << std::endl;
}

我想在第一种情况下,main将退出而不等待后台运行的线程。至少在第三种情况下,main将阻止future.get()。

引擎盖下究竟发生了什么?

1 个答案:

答案 0 :(得分:5)

async返回的期货在他们的dtor中有一个.wait(),但是:这种行为可能是move

这解释了你的所有症状。