Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将期货放入容器中?_C++_Multithreading_C++11 - Fatal编程技术网

C++ 如何将期货放入容器中?

C++ 如何将期货放入容器中?,c++,multithreading,c++11,C++,Multithreading,C++11,我试图将async生成的未来放在一个向量中,因此我不必执行以下操作: auto f1 = async(....); auto f2 = async(....); ... f1.get(); f2.get(); ... 我在这段代码中收到的编译错误是“调用已删除的'std::_1::future'构造函数”。有谁能帮我正确地做这件事吗。也不确定是否要将未来的复制到向量中 void AudioAnalyzer::retrieve() { deque<shared_ptr<Aud

我试图将async生成的未来放在一个向量中,因此我不必执行以下操作:

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);
        }
    }
}
void AudioAnalyzer::retrieve()
{
dequetempData(数据);
矢量期货;
对于(int i=0;i
期货不可复制,但可移动复制。您需要将它们移动到容器中:

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

在这里,
std::move(f)
看起来像一个右值,导致选择了正确的重载。

如果您使用的是C++11,还可以使用std::vector的新的
emplace\u back
操作符,如下所示:

futures.emplace_back(std::async(std::launch::async, f));
这将在适当的位置构造
std::future
对象(直接进入std::vector),从而避免复制或移动未来


请参见

注意,您也可以直接使用
futures.push_back(异步(..)