2011-07-26 1 views
1

Comment puis-je utiliser un vecteur de threads à terme pour obtenir les valeurs de retour d'un groupe de threads? Est-ce que cela devrait fonctionner? Si non, comment l'adapter?Comment est-ce que j'utilise un vecteur de futures de fil de poussée?

int calculate_the_answer_to_life_the_universe_and_everything() 
{ 
    return 42; 
} 

vector<packaged_task<int> > tasks; 
vector<unique_future<int> > futures; 
for (int i=0; i < 4; ++i) 
{ 
    tasks.push_back(packaged_task<int>(calculate_the_answer_to_life_the_universe_and_everything)); 
    futures.push_back(tasks.back().get_future()); 
    thread task(tasks.back()); 
} 

boost::wait_for_all(futures.begin(), futures.end()); 

Répondre

7

Bien que ce code ne compile pas parce que les tâches empaquetées ne sont pas copiables. En fonction de l'énoncé du problème, tout ce dont vous avez besoin est un vecteur de contrats à terme, pourquoi même essayer de stocker packaged_tasks?

#include <boost/thread.hpp> 
#include <iostream> 
#include <vector> 
int the_answer() 
{ 
    return 42; 
} 
int main() 
{ 

    std::vector<boost::unique_future<int> > futures; 
    for (int i=0; i < 4; ++i) 
    { 
     boost::packaged_task<int> pt(the_answer); 
     futures.push_back(pt.get_future()); 
     boost::thread task(std::move(pt)); 
    } 
    boost::wait_for_all(futures.begin(), futures.end()); 

    for(size_t n=0; n<futures.size(); ++n) 
     std::cout << futures[n].get() << ' '; 
    std::cout << '\n'; 
} 
+0

Je suis juste curieux, sans sémantique de mouvement, comment pourrait-on stocker un ensemble de tâches ou de contrats à terme? Pourrait-on également stocker un ensemble de shared_ptr > (ou futures)? –

Questions connexes