fork () vs std :: async em C ++
Eu sou novo nos conceitos de asyc e fork, o que entendi até agora é que o fork () cria processos chid que serão executados de forma assíncrona. E o std :: async criará um thread do pool do sistema e o lançará de forma assíncrona aqui se eu mencionar std :: launch :: async .
Por exemplo, como o conjunto de código abaixo difere? 1: usando std :: async
std::vector<std::future<void>> result;
for(i=0;i<5;i++){
result. push_back(std::async(std::launch::asyc, foo, var1));
}
for( auto e : result)
e.get();
2ª: Usando fork ()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
Assuma que o tipo de retorno da função foo é nulo e os argumentos são passados como referência ou ponteiros.
Respostas
A principal diferença é que, no caso de std::async, os dois threads de execução compartilham um processo. No caso de fork, cada um tem seu próprio processo.
Essa diferença afeta mais significativamente as coisas que mudam após a chamada. No caso de fork, cada processo pode então abrir e fechar seus próprios descritores de arquivo, gerenciar seu próprio espaço de memória e assim por diante. No caso de std::async, os threads continuam a compartilhar descritores de arquivo, espaço de memória e assim por diante.
fork()
fork()cria um processo filho duplicando o processo de chamada. O processo filho é separado do processo pai para que cada um tenha sua própria memória e, sem configurar nenhum canal de comunicação entre os processos, é impossível passar dados entre os dois processos. O caso de uso mais comum para chamada fork()é iniciar um processo como um serviço em segundo plano (também conhecido como "daemon"). Por exemplo, quando você inicia seu servidor web favorito na linha de comando, ele pode bifurcar um processo filho (o processo do servidor real). Feito isso, o processo principal termina, então o controle retorna ao seu shell e você pode fazer outras coisas.
std::async
std::asyncexecuta uma função em um thread separado (assumindo a política std::launch::async). Ele retorna um std::futureno qual você pode chamar get()para obter o valor retornado pela função (assumindo que ele retornou e não lançou uma exceção). A get()chamada retorna imediatamente se a função foi concluída nesse meio tempo, caso contrário, ela bloqueia até que a função seja retornada. Este recurso é std::asyncuma ferramenta útil para executar cálculos caros em segundo plano enquanto faz outra coisa.