c ++ асинхронные фьючерсы не заканчиваются - PullRequest
0 голосов
/ 18 октября 2018

Я запускаю несколько экземпляров симуляции в C ++, которые я хочу распространять, используя фьючерсы, чтобы уменьшить время выполнения программы.Основная функция runSimulation принимает объект Parameters и возвращает список результатов (точнее, вектор двойных значений).

Если я позволю всему работать последовательно, это будет работать (но медленно).Если я использую std::async, некоторые, но не все будущие вызовы застревают и ничего не возвращают.

Мой код выглядит следующим образом:

const int l = 8; // number of simulations to run
std::vector<Parameters> params = createRandomParameters(l);

std::vector<std::vector<double>> simRes;
simRes.reserve(l);

// set up the futures
std::vector<std::future<std::vector<double>>> futures;
futures.reserve(l);

// create the futures
for (int i = 0; i < l; ++i) {
    futures.push_back(std::async(std::launch::async, &runSimulation, params[i]));
}

// get the results
for (auto &fut : futures) {
    simRes.push_back(fut.get());
}

Обратите внимание, что только некоторые из фьючерсовзависание, в то время как другие работают, как и ожидалось (это можно увидеть, посмотрев на мой системный монитор и загрузку его ЦП).

Последовательный

Если я заменю часть фьючерса на

for (int i = 0; i < l; ++i) simRes.push_back(runSimulation(params[i]));

все работает (но, конечно, медленно), поэтому я думаю, что ошибка не в функции симуляции.

Отложено

Использование std::launch::deferred вместо std::launch::async также работает, но так как я вызываю fut.get() последовательно, выполнение не выполняется параллельно.

Опуская std::launch вне (т. е. futures.emplace_back(std::async(&runSimulation, params[i])); приводит к тому же поведению, что и с std::launch::async.

К сожалению, я не могу воспроизвести эту ошибку с другой функцией MWE.

Система

Я использую Ubuntu 18.04.1 с gcc 7.3.0. В CMake я указываю -pthread отметьте и используйте C ++ 17 (я также пробовал 11 и 14 ...).

Любая идея, что можетвызвать такое поведение или как это исправить, чтобы я мог запустить симуляцию на разных ядрах?

...