2014-05-04 15 views
6

che sto cercando di mettere i futuri generati da asincrona in un vettore, quindi non c'è bisogno di fare qualcosa di simile:Come si inseriscono i future in un container?

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

l'errore di compilazione che sto ricevendo con questo codice è "Chiamata al costruttore cancellato di 'std :: _ 1 :: future ". Qualcuno può aiutarmi con come farlo correttamente. Non sono sicuro nemmeno di copiare il futuro nel vettore.

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

risposta

10

I futures non sono copiabili, ma sono trasferibili. È necessario spostarli nel contenitore:

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

Qui, std::move(f) sembra un rvalue, con conseguente diritto std::vector<future<void>>::push_back sovraccarico di essere selezionato.

+0

Grazie, ha senso. –

+0

Nota che puoi anche usare direttamente 'futures.push_back (async (..));'. – Jarod42

6

Se si utilizza C++ 11, è possibile anche utilizzare il nuovo gestore del emplace_back std :: vector in questo modo:

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

Questo sarà costruire l'std::future oggetto sul posto (direttamente in std :: vector) e quindi evitare di dover copiare o spostare il futuro.

Vedi http://en.cppreference.com/w/cpp/container/vector/emplace_back

Problemi correlati