Возврат асинхронного результата — эффективная обработка синхронного случая

Вы можете иметь такой асинхронный API

std::future<int> GetAsync()

Есть случаи, когда, например, вы уже кэшировали результат и хотели бы вернуть будущее, инициализированное с результатом. Есть ли способ с текущим стандартом (или предложением), чтобы достичь этого без повторения создания дополнительного std :: обещания или создания дополнительной асинхронности (с отложенной политикой запуска)?

РЕДАКТИРОВАТЬ

Рассмотрим также случай, когда результат вычисляется на основе некоторого состояния, локального для функции GetAsync (), и необходимости фиксировать это, вероятно, по значению в случае, если кто-либо решит использовать std :: async с отложенной политикой запуска

2

Решение

Я явно что-то неправильно понимаю, почему вы не можете просто сделать это:

std::future<int> GetAsync()
{
if (/*already got result*/)
{
std::promise<int> p;
p.set_value(/*result*/);
return p.get_future();
}
return std::async(/*whatever is needed*/);
}

Что плохого в создании обещания? Если вы хотите получить результат из будущего (асинхронный возвращаемый объект), вам нужен асинхронный поставщик, promise такой тип.

10

Другие решения

Фьючерсы и обещания заключаются в том, что они предназначены для многопоточного использования. Поэтому, если вы хотите вернуть объект будущего, вам нужно создать его либо через std::async позвонить, std::packaged_task<> или std::promise<>, Если это так, то ответ @ ronag — хит.

Если это не общий случай, и вы просто хотите вернуть косвенное значение к вашему значению, вы можете использовать std::function для прямого вычисления или механизм кеширования вокруг него, или Expected<T> значение для обработки ошибок тоже, что и для фьючерсов; Таким образом, вы не будете платить за связь потоков.

0

По вопросам рекламы [email protected]