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