我试图将异步生成的期货放在一个向量中,所以我不必做类似的事情:
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);
}
}
}
答案 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