fork () vs std :: async en C ++

Sep 01 2020

Soy nuevo en los conceptos de asyc y fork, lo que entendí hasta ahora es que fork () crea procesos chid que se ejecutarán de forma asincrónica. Y std :: async creará un hilo desde el grupo del sistema y lo lanzará de forma asincrónica aquí si menciono std :: launch :: async .

Por ejemplo, ¿en qué se diferencia el siguiente conjunto de códigos? 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();

2do: Usando tenedor ()

for(i=0;i<5;i++){ 
    if(fork()==0){
        foo(var1);
        exit(0);
    }
}

Suponga que el tipo de retorno de la función foo es nulo y que los argumentos se pasan como referencia o punteros.

Respuestas

2 DavidSchwartz Sep 01 2020 at 05:28

La diferencia clave es que en el caso de std::async, los dos hilos de ejecución comparten un proceso. En el caso de fork, cada uno tiene su propio proceso.

Esta diferencia afecta de manera más significativa a las cosas que cambian después de la llamada. En el caso de fork, cada proceso puede abrir y cerrar sus propios descriptores de archivo, administrar su propio espacio de memoria, etc. En el caso de std::async, los subprocesos continúan compartiendo descriptores de archivo, espacio de memoria, etc.

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()crea un proceso hijo duplicando el proceso de llamada. El proceso hijo se separa del proceso padre, por lo que cada uno tiene su propia memoria y, sin establecer ningún canal de comunicación entre procesos, es imposible pasar datos entre los dos procesos. El caso de uso más común para realizar llamadas fork()es iniciar un proceso como un servicio en segundo plano (también conocido como "demonio"). Por ejemplo, cuando inicia su servidor web favorito en la línea de comandos, puede bifurcar un proceso secundario (el proceso del servidor real). Una vez hecho esto, el proceso principal finaliza, por lo que el control vuelve a su shell y puede hacer otras cosas.

std::async

std::asyncejecuta una función en un hilo separado (asumiendo una política std::launch::async). Devuelve un objeto std::futureal que puede llamar get()para obtener el valor devuelto por la función (asumiendo que regresó y no lanzó una excepción). La get()llamada regresa inmediatamente si la función se ha completado mientras tanto; de lo contrario, se bloquea hasta que la función haya regresado. Esta característica es std::asyncuna herramienta útil para ejecutar cálculos costosos en segundo plano mientras se hace otra cosa.