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