我怎么把未来放在一个容器里

How do I put futures in a container?

本文关键字:一个 未来      更新时间:2023-10-16

我试图把异步生成的期货在一个向量,所以我不需要做这样的事情:

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);
        }
    }
}

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

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

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

如果使用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