Как мне использовать вектор фьючерсов на продвижение потоков? - PullRequest
1 голос
/ 26 июля 2011

Как я могу использовать вектор фьючерсов потоков, чтобы получить возвращаемые значения из группы потоков?Должно ли это работать?Если нет, то как мне его адаптировать?

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

1 Ответ

7 голосов
/ 26 июля 2011

Ну, этот код не компилируется, потому что упакованные задачи не могут быть скопированы.

Исходя из формулировки проблемы, все, что вам нужно - это вектор будущего, зачем даже пытаться хранить 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';
}
...