Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Повторное использование объекта std::future

Можно ли присваивать новое значение объекту std::future, не получив результата выполнения предыдущей задачи?
Например:
std::future f; // глобальная переменная
TResult thread_func(params) { /* тут какие-то тяжелые вычисления */ }
// запрос "долгой" операции (может поступить до окончания предыдущего расчета!) void RequestAsync() { f = std::async(thread_func, some_params); }
// проверяем получение результата (например, таймером) void CheckResult() { if (!f.valid()) return;
TResult result = f.get(); }
Я тестировал этот код и не получил никаких ошибок, но сомнения в корректности такого присваивания остаются. К примеру, что будет, если несколько запущенных потоков вернут значение параметра одновременно? Не возникнет ли утечка памяти, при попытке потока вернуть значение через уже перезаписанную async'ом переменную?


Ответ

Это Вы думаете, что Ваш код так работает. И, в целом, это логично. К сожалению, реальность такова, что код работает по другому. Вот как работает эта строчка:
f = std::async(thread_func, some_params);
Если в f сохранена future предыдущего запуска async, то только после того, как завершится предыдущая операция, новый объект future будет помещён в f. Таким образом, при таком подходе, не более 2-х одновременно выполняемых операций может быть, и никогда в f нельзя будет поместить новый объект, пока старый не завершился.

Комментариев нет:

Отправить комментарий