Execução assíncrona em C++

Para criar um função que realize uma execução assíncrona é necessário utilizar a std::future e std::async, conforme o exemplo abaixo:

#include ‹iostream›
#include ‹string›
#include ‹future›

// Calcula se o numero é primo
bool is_prime(int x) {
for (int i = 2; i‹x; ++i) if (x%i == 0) return false;
return true;
}

int main(){
std::future‹bool› is = std::async(is_prime, 444444443);

std::cout ‹‹ "Calculando, por favor espere";
// verifica se já tem o resultado a cada 100 milissegundos
std::chrono::milliseconds span(100);
while (is.wait_for(span) == std::future_status::timeout) {
std::cout ‹‹ '.' ‹‹ std::flush;
// AQUI VOCÊ PODE FAZER QUALQUER TIPO DE EXECUÇÃO!
}

// Após o retorno do std::future_status "ready"
// o valor é retornado sem travar a thread.
bool prime = is.get();
std::cout ‹‹ "\n444444443 "
‹‹ (prime ? "is" : "is not")
‹‹ " prime.\n";
system("pause");
return 0;
}

Existem quatro funções possíveis na execução do std::future, que são: wait, wait_until, wait_for e get.

Wait e Get

Essas funções esperam até executar todo o processamento, a diferença entre as duas é que a wait retorna o status da execução e o get retorna o valor esperado.

Wait_Until

Essa função esperá uma hora determinada para executar o processamento, caso contrário ela finaliza a execução.

Por exemplo:

#include ‹iostream›
#include ‹string›
#include ‹future›
// Calcula se o numero é primo
bool is_prime(int x)
{
for (int i = 2; i‹x; ++i) if (x%i == 0) return false;
return true;
}

int main()
{
std::future‹bool› is = std::async(is_prime, 444444443);

std::cout ‹‹ "Calculando, por favor espere";
// verifica se já tem o resultado a cada 100 milissegundos
auto now= std::chrono::system_clock::now();
// Espera por 100 milissegundos
if(is.wait_until(now + std::chrono::milliseconds(100)) == std::future_status::timeout){
std::cout ‹‹ "Timeout" ‹‹ std::endl;
} else {
bool prime = is.get();
std::cout ‹‹ "\n444444443 " ‹‹ (prime ? "is" : "is not") ‹‹ " prime.\n";
}
system("pause");
return 0;
}

Wait_for

Essa função esperá por um tempo determinado para executar o processamento.

Tem alguma dúvida ou sugestão? Deixe nos comentários!

Deixe um comentário