std::future
имеет метод wait
, который блокирует. Вызовите этот метод в фоновом потоке, когда wait
возвращает, будущее готово, затем вы можете вызвать обратный вызов с готовым будущим в качестве параметра:
Некоторый код:
struct FutureCallback {
std::thread th;
template<class C>
FutureCallback(C c, std::future<int> f) {
th = std::thread(
[c = std::move(c), f = std::move(f)]() mutable
{
f.wait(); // wait until future is ready
c(f); // call callback
}
);
}
~FutureCallback() {
if (th.joinable())
th.join();
}
};
void callback(std::future<int>& f) {
std::cout << "res printing in callback: " << f.get();
}
int main() {
std::packaged_task<int()> task([](){
std::this_thread::sleep_for(std::chrono::seconds(5));
return 10;
});
std::future<int> f = task.get_future();
FutureCallback cb(&callback,std::move(f));
task();