Um exemplo com e sem std::async para notarmos as diferenças.
std::async foi introduzido no C++11. Ele é um template de função que aceita funções de callback como argumento e potencialmente os executa de forma assíncrona.
Ou seja, utilizando-o você pode melhorar a velocidade de uma aplicação, pois o tempo de retorno é usado de forma paralela.
Podemos criar std::async com 3 políticas de inicialização diferentes:
std::launch::async - Ele garante o comportamento assíncrono, ou seja, a função passada será executada em uma thread separada.
std::launch::deferred - Comportamento não assíncrono, a função será chamada quando outro thread chamar get() no futuro para acessar o estado compartilhado.
std::launch::async | std::launch::deferred - É o comportamento padrão. Com esta política de inicialização, ele pode ser executado de forma assíncrona ou não.
Se não especificarmos uma política de inicialização, std::launch::async | std::launch::deferred será utilizado.
No exemplo desse artigo vamos utilizar std::launch::async.
Podemos passar qualquer tipo de função de callback em std::async:
Suponhamos que estamos desenvolvendo uma aplicação que precisa consumir 2 APIs diferentes e os dados retornados dessas APIs precisamos concatenar com dados que possuímos para gerar um novo nome.
Sem usar std::async faríamos mais ou menos assim:
Vamos ustilizar std::chrono para criar um sleep para dar impressão que seria o tempo de demora do retorno dos dados.
SEM std::async
vim exemplo-sem-async.cpp
A saída desse exemplo será 4 segundos, pois será somado o tempo da 1º API(2 segundos) mais o tempo da 2º API(2 segundos).
Ou seja, um foi executado após o outro.
Agora vamos utilizar o mesmo código, mas vamos incluir somente TRÊS linhas para usar o std::async:
1. Vamos incluir o cabeçalho: #include <future>
2. Após o comentário: // Solicita os dados da primeira API, vamos alterar a linha para essa linha:
3. E após a solicitação da segunda API vamos adicionar essa linha:
Perceba que estamos agora utilizando std::future para obter os dados via a função get().
COM std::async
vim exemplo-com-async.cpp
O código final com uso de std::async ficaria assim:
Para compilar precisamos utilizar a flag: -pthread, exemplo:
g++ -pthread exemplo-com-async.cpp
Agora note que a saída foram gastos somente 2 segundos, ou seja, a primeira API foi executada de forma paralela à segunda API, a saída será:
Agora ficou mais fácil de entender, né?
Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !
Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!