2014-05-04 19 views
6

Ben bir vektör içinde eşzamansız modu tarafından oluşturulan gelecekleri koymak için çalışıyorum, bu yüzden böyle bir şey yapmak gerekmez: Bu kod ile alıyorum derleme hatasıdırFutures'ı bir konteynere nasıl koyarım?

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

"silindi kurucusuna Çağrı 'std :: _ 1 :: future'. Bunu nasıl yapacağı konusunda bana yardımcı olabilir. Geleceğin vektöre kopyalanmasından da emin değilsiniz.

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

cevap

10

Futureslar devredilemez, ancak bunlar taşınır niteliktedir. Sen kabın içine taşımak gerekir: Burada

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

, std::move(f) seçildiği sağ std::vector<future<void>>::push_back aşırı sonuçlanan bir rvalue benziyor.

+0

sayesinde mantıklı bakın. –

+0

Ayrıca doğrudan 'futures.push_back (async (..));' kullanabilirsiniz. – Jarod42

6

C++ 11 kullanıyorsanız, ayrıca şöyle std yeni emplace_back operatörünü :: vector kullanabilirsiniz:

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

Bu std::future nesneyi yerinde (doğrudan std içine inşa edecek :: vektör) ve böylece geleceği kopyalamak veya taşımak zorunda kalmaktan kaçının.

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

İlgili konular