Как вызвать ассинхронную лямбду в C++?
Можно ли вызвать ассинхронную лямбду в С++ (или unreal)?
Вот пример псевдокода. Если убрать async и await строку то код работает и возвращает 11 в переменную res.
float res = async ([](float a, float b) {
await Delay(2000);
return (std::abs(a) + std::abs(b));
})(5,6);
Ответы (1 шт):
Автор решения: moglio
→ Ссылка
Если правильно пониманию, вы хотите вызвать лямбду асинхронно, то вот вам простой пример как это сделать. Требуется компилятор, поддерживающий C++11 страндарт и выше.
// std::launch имеет 2 вариант запуска выбираете удобный
// https://en.cppreference.com/w/cpp/thread/launch
// Параметр запуска std::launch::async гарантирует асинхронность в общем случае.
auto f = std::async(std::launch::async, [](float a, float b) {
return (std::abs(a) + std::abs(b));
}, 5, 6);
.get() блокирует вызывающий поток, пока не исполнится вызываюший код
auto result = f.get();
В вашем примере где вы хотите ждать какое-то время подойдет wait_for() + get() методы.
std::cout << "waiting...\n";
std::future_status status;
using namespace std::chrono::literals;
do {
switch(status = f.wait_for(2000ms); status) {
case std::future_status::timeout: std::cout << "timeout\n"; break;
case std::future_status::ready: std::cout << "ready!\n"; break;
}
} while (status != std::future_status::ready);
std::cout << "result is " << future.get() << '\n'; // 11