почему форсированные фьючерсы возвращают разные значения? - PullRequest
0 голосов
/ 15 января 2019

Я хочу написать код, в котором я использую фьючерсы и потоки повышения для параллельного вычисления нескольких функций:

Функция называется «функция», которая принимает «входы», и я хочу сохранить возвращаемые функцией значения в векторе с именем «результаты»

КОД 1 (только часть основного кода):

    for (int i = 0; i < max_iter; i++) {
          boost::shared_future<double>> future = boost::async(boost::launch::async,boost::bind(&function,input));
          results[i] = future.get();}

Но я бы хотел, чтобы потоки работали параллельно, поэтому я попытался сделать этот код, который сохраняет фьючерсы в векторе, а затем получает результаты, как только все фьючерсы будут готовы. Я использовал функцию wait_for_all из boost для ожидания завершения потоков ..

CODE 2 (только часть основного кода):

    for (int i = 0; i < max_iter; i++) {
                      boost::shared_future<double>> future = boost::async(boost::launch::async,boost::bind(&function,input));
                      future_buffer.push_back(future);

    boost::wait_for_all(future_buffer.begin(), future_buffer.end())

    for (int l = 0; l < max; l++) {
        results[l] = future_buffer[l].get()
    }

Я должен соблюдать как КОД 1, так и КОД 2, но получаю разные результаты ... Я проверял, и КОД 1 дает правильные результаты, а КОД 2 - нет, и я не мог понять, почему? ... что мне здесь не хватает ...?

1 Ответ

0 голосов
/ 15 января 2019

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

Ваш первый код делает все последовательно. Он также имеет большое количество накладных расходов на запуск потоков, а затем немедленно ожидает их завершения. В остальном он такой же как

for (int i = 0; i < max_iter; i++) {
    results[i] = function(input);
}

Ваш второй код (вероятно) делает вещи параллельно. Похоже, у вас есть данные, которые вы используете для всех вызовов function, и изменение в одном потоке делает недействительными данные, увиденные в другом.

...