Как вызвать ассинхронную лямбду в C++?

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2023

Можно ли вызвать ассинхронную лямбду в С++ (или 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Принят

Если правильно пониманию, вы хотите вызвать лямбду асинхронно, то вот вам простой пример как это сделать. Требуется компилятор, поддерживающий 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