C++ Async

Da Andreabont's Wiki.

Lo std::async in C++ è un livello di astrzione della std::thread, il quale ritorna un std::future per la gestione del valore di ritorno.

Compilazione

g++ <file.cpp> -std=c++11 -pthread

Esecuzione di codice asincrono in un thread separato

Con questa opzione, il codice viene eseguito in un thread separato che parte al momento della dichiarazione. Alla richiesta del risultato viene implicitamente eseguita una join sul thread.

#include <iostream>
#include <future>
#include <thread>

std::string codice_asincrono(std::string input) {
   return input;
}

int main()
{
    std::future<std::string> f = std::async(std::launch::async, codice_asincrono, "Ciao mondo!");
    std::cout << "Result are: " << f.get() << std::endl;
}

Esecuzione di codice demandata al momento della richiesta

Con questa opzione, il codice viene eseguito nello stesso thread del chiamante al momento della richiesta del risultato.

#include <iostream>
#include <future>
#include <thread>

std::string codice_asincrono(std::string input) {
   return input;
}

int main()
{
    std::future<std::string> f = std::async(std::launch::deferred, codice_asincrono, "Ciao mondo!");
    std::cout << "Result are: " << f.get() << std::endl;
}

Wrapper di Scott Meyers

Scott Meyers consiglia di utilizzare questo wrapper a std::async per renderlo più robusto:

template <typename F, typename... Ts>
inline auto reallyAsync(F&& f, Ts&&... params) {
   return std::async(std::launch::async, std::forward<F>(f), std::forward<Ts>(params)...);
}