Страницы

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

вторник, 10 декабря 2019 г.

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

#cpp #многопоточность #cpp11


Можно ли присваивать новое значение объекту 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'ом переменную?
    


Ответы

Ответ 1



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

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

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