如何将期货放入集装箱?

时间:2014-05-04 15:41:33

标签: c++ multithreading c++11

我试图将异步生成的期货放在一个向量中,所以我不必做类似的事情:

auto f1 = async(....);
auto f2 = async(....);
...
f1.get();
f2.get();
...

我使用此代码收到的编译错误是"调用删除的构造函数' std :: _ 1 :: future"。谁能帮助我如何正确地做到这一点。不确定将未来复制到矢量中。

void AudioAnalyzer::retrieve()
{
    deque<shared_ptr<AudioAnalysis>>tempData(data);
    vector<future<void>> futures;
    for (int i = 0; i < NUM_THREADS; ++i)
    {
        auto f = async(bind(&AudioAnalyzer::analysisThread, this, _1), ref(tempData));
        futures.push_back(f);
    }

    for (auto& f : futures)
    {
        f.get();
    }

}

void AudioAnalyzer::analysisThread(deque<shared_ptr<AudioAnalysis>>& aq )
{

    while (true)
    {
        m.lock();
        if (aq.size() == 0)
        {
            m.unlock();
            break;
        }
        auto aa = aq.front();
        aq.pop_front();
        m.unlock();

        if (false) //testing
        {
            retrieveFromDb(aa);
        }
        else
        {
            analyzeAudio(aa);
        }
    }
}

2 个答案:

答案 0 :(得分:14)

期货不可复制,但它们是可移动的。您需要将它们移动到容器中:

futures.push_back(std::move(f));

此处,std::move(f)看起来像一个右值,导致选择了正确的std::vector<future<void>>::push_back重载。

答案 1 :(得分:8)

如果你使用的是C ++ 11,你也可以使用std :: vector的新emplace_back运算符,如下所示:

futures.emplace_back(std::async(std::launch::async, f));

这将就地构造std::future对象(直接进入std :: vector),从而避免复制或移动未来。

请参阅http://en.cppreference.com/w/cpp/container/vector/emplace_back